compareTo() 在两个不同的 类 中,一个不可达
compareTo() in two different classes, one not reachable
我有两个不同的 classes 和两个不同的 compareTo()
-methods。当我对 list
进行排序时,我希望它首先按 age
排序。但如果是两个 Fysiker 被排序,并且他们的年龄相同,我希望它在 "year" 上排序,这是他们开始学习的年份。
当我 运行 我的主要 class 时,我将 80 个 Fysiker 放入列表中,对它们进行排序,然后打印它们。他们都是按年龄排序的,而不是按年份排序的(如果他们的年龄相同)。
Edit1(为什么不是重复的):
我不能使用 abstract
来解决这个问题的原因(他们在这个问题的重复标记版本中已经完成)是因为我需要能够通过编写 [=19] 来实例化 Human
=].
主要class:
public class Main {
public static void main(String[] args) {
ArrayList<Human> randomFysiker = new ArrayList<Human>();
for (int j=0;j<80;j++) {
Fysiker f = new Fysiker();
randomFysiker.add(f);
}
Collections.sort(randomFysiker);
System.out.println(randomFysiker);
}
}
人类class:
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class Human implements Comparable<Human> {
int age;
String name;
List<String> people = Arrays.asList("A","B","C","D","E","F","G","H","I","J","K","L","M","N","P");
Random randomGenerator = new Random();
public Human(int myAge, String myName) {
name = myName;
age = myAge;
}
public Human() {
this.age = randomAge();
this.name = randomName();
}
public int compareTo(Human o) {
return this.age - o.age;
}
private int randomAge() {
return randomGenerator.nextInt(100);
}
protected String randomName() {
return people.get(randomGenerator.nextInt(people.size()));
}
public int getAge() {
return this.age;
}
public String getName() {
return name;
}
public String toString() {
return "\nName: " + name + "\nAge: " + age + " yrs old\n";
}
}
菲斯克 class:
public class Fysiker extends Human {
private int year;
public Fysiker(int myAgeF, String myNameF, int myYearF) {
this.name = myNameF;
this.age = myAgeF;
this.year = myYearF;
}
public Fysiker() {
this.name = randomName();
this.age = randomAge();
this.year = randomYear();
}
public int compareTo(Fysiker o) {
if (this.age - o.age != 0) {
return super.compareTo(o);
}
else {
return this.year - o.year;
}
}
private int randomAge() {
return 15 + randomGenerator.nextInt(86);
}
private int randomYear() {
int yearfifteen = 2015 - age + 15;
if (yearfifteen >= 1932 && 2015 >= yearfifteen){
return randomGenerator.nextInt(age-14) + yearfifteen; //(max-min)=(yearfifteen+age-15+1)-(yearfifteen+1)
}
else {
return 1932 + randomGenerator.nextInt(84);
}
}
public int getYear(){
return year;
}
public String toString() {
return super.toString() + "Started Physics: " + String.format("F%02d", this.year%100) + "\n";
}
}
将Fysiker
class的compareTo()
方法改为:
public int compareTo(Human o) {
if (this.age - o.age != 0) {
return super.compareTo(o);
}
else {
return this.year - ((Fysiker)o).year;
}
}
所以这将覆盖 superclass 方法,因此将调用 subclass 的方法,即 Fysiker。
Fysiker
的compareTo()
-方法应该改为;
public int compareTo(Human o) {
if(this.age==o.age && o instanceof Fysiker) {
return this.year - ((Fysiker)o).year;
}
return super.compareTo(o);
}
如果两个Human
的年龄相同,而且都是classFysiker
,那么会按照这个方法按年份排序。
我有两个不同的 classes 和两个不同的 compareTo()
-methods。当我对 list
进行排序时,我希望它首先按 age
排序。但如果是两个 Fysiker 被排序,并且他们的年龄相同,我希望它在 "year" 上排序,这是他们开始学习的年份。
当我 运行 我的主要 class 时,我将 80 个 Fysiker 放入列表中,对它们进行排序,然后打印它们。他们都是按年龄排序的,而不是按年份排序的(如果他们的年龄相同)。
Edit1(为什么不是重复的):
我不能使用 abstract
来解决这个问题的原因(他们在这个问题的重复标记版本中已经完成)是因为我需要能够通过编写 [=19] 来实例化 Human
=].
主要class:
public class Main {
public static void main(String[] args) {
ArrayList<Human> randomFysiker = new ArrayList<Human>();
for (int j=0;j<80;j++) {
Fysiker f = new Fysiker();
randomFysiker.add(f);
}
Collections.sort(randomFysiker);
System.out.println(randomFysiker);
}
}
人类class:
import java.util.Arrays;
import java.util.List;
import java.util.Random;
public class Human implements Comparable<Human> {
int age;
String name;
List<String> people = Arrays.asList("A","B","C","D","E","F","G","H","I","J","K","L","M","N","P");
Random randomGenerator = new Random();
public Human(int myAge, String myName) {
name = myName;
age = myAge;
}
public Human() {
this.age = randomAge();
this.name = randomName();
}
public int compareTo(Human o) {
return this.age - o.age;
}
private int randomAge() {
return randomGenerator.nextInt(100);
}
protected String randomName() {
return people.get(randomGenerator.nextInt(people.size()));
}
public int getAge() {
return this.age;
}
public String getName() {
return name;
}
public String toString() {
return "\nName: " + name + "\nAge: " + age + " yrs old\n";
}
}
菲斯克 class:
public class Fysiker extends Human {
private int year;
public Fysiker(int myAgeF, String myNameF, int myYearF) {
this.name = myNameF;
this.age = myAgeF;
this.year = myYearF;
}
public Fysiker() {
this.name = randomName();
this.age = randomAge();
this.year = randomYear();
}
public int compareTo(Fysiker o) {
if (this.age - o.age != 0) {
return super.compareTo(o);
}
else {
return this.year - o.year;
}
}
private int randomAge() {
return 15 + randomGenerator.nextInt(86);
}
private int randomYear() {
int yearfifteen = 2015 - age + 15;
if (yearfifteen >= 1932 && 2015 >= yearfifteen){
return randomGenerator.nextInt(age-14) + yearfifteen; //(max-min)=(yearfifteen+age-15+1)-(yearfifteen+1)
}
else {
return 1932 + randomGenerator.nextInt(84);
}
}
public int getYear(){
return year;
}
public String toString() {
return super.toString() + "Started Physics: " + String.format("F%02d", this.year%100) + "\n";
}
}
将Fysiker
class的compareTo()
方法改为:
public int compareTo(Human o) {
if (this.age - o.age != 0) {
return super.compareTo(o);
}
else {
return this.year - ((Fysiker)o).year;
}
}
所以这将覆盖 superclass 方法,因此将调用 subclass 的方法,即 Fysiker。
Fysiker
的compareTo()
-方法应该改为;
public int compareTo(Human o) {
if(this.age==o.age && o instanceof Fysiker) {
return this.year - ((Fysiker)o).year;
}
return super.compareTo(o);
}
如果两个Human
的年龄相同,而且都是classFysiker
,那么会按照这个方法按年份排序。