【发布时间】:2017-11-10 00:25:46
【问题描述】:
所以目前我正在执行一项任务,我必须参加两个班级,一个名为 Fysiker,另一个名为 Human。 Fysiker 只是 Human 类的扩展。 Human 有两个属性:name 和 age,而 Fysiker 有三个属性:name、age 和 startyear。我创建了一个包含 Human 和 Fysiker 的数组,我想先按年龄对其进行排序,但如果两个 fysiker 的年龄相同,我希望它按我的第三个属性排序:startyear。
我对 compareTo 的理解(为了练习,我需要使用 compareTo)是有限的,但从我读到的内容来看,它是一个可与 Collections.sort() 自动交互的可比较,我的代码目前看起来像这样:
import java.util.List;
import java.util.Arrays;
import java.util.Random;
import java.util.ArrayList;
import java.util.Collections;
public class Fysiker extends Human{
public int startyear;
public Fysiker(int age, String name, int startyear){
this.age=age;
this.name=name;
this.startyear=startyear;
}
public int getYear(){
return startyear;
}
public int compareTo(Fysiker o){
int b;
b=(this.age>o.age ? 1:this.age<o.age ? -1:0);
if (b==0){
b=(this.startyear>o.startyear ? 1:this.startyear<o.startyear ? -1:0);
return b;}
else{
return b;}
}
public String toString(){
return "åldern är:"+this.age+" "+"namnet är:"+this.name+" "+"började fysik:"+String.format("F%02d",this.startyear%100);
}
public Fysiker(){
this.age=15+rand.nextInt(86);
this.name=names.get(rand.nextInt(names.size()));
this.startyear=2015-rand.nextInt(this.age-14);
while (this.startyear<1932){
this.startyear=2015-rand.nextInt(this.age-14);
}
}
public static void main(String[] args){
ArrayList<Human> fysiker=new ArrayList<Human>();
int q;
for (q=0;q<=80;q++){
fysiker.add(new Fysiker());
//fysiker.add(new Human());
//System.out.println(fysiker.get(q).toString());
}
int s;
Collections.sort(fysiker);
for (s=0;s<=fysiker.size()-1;s++){
//fysiker.get(0).compareTo(fysiker.get(s));
System.out.println(fysiker.get(s).toString());
//System.out.println(fysiker.get(0));
}
}
}
Human 类依次类:
import java.util.List;
import java.util.Arrays;
import java.util.Random;
import java.util.ArrayList;
public class Human implements Comparable<Human>{
public static final List<String> names = Arrays.asList("Rutger","Oscar","Aram","Noak","Hilda","Dahl");
public Random rand=new Random();
public String name;
public int age;
public Human(int age, String name){
this.age=age;
this.name=name;
}
public Human(){
this.age=rand.nextInt(101);
this.name=names.get(rand.nextInt(names.size()));
}
public String getName(){
return this.name;
}
public int getAge(){
return this.age;
}
public String toString(){
return "åldern är:"+this.age+" "+"namnet är:"+this.name;
}
public int compareTo(Human o){
return this.age-o.age;
}
}
我的问题是它在 startyear 之后没有排序,但如果我从 Human 类中删除 compareTo 可以修复它,但我也需要那个,我想对它们全部排序,但它修复了“不在 startyear 之后为 fysiker" 问题排序。我从这里去哪里?
【问题讨论】:
-
你需要实现 Comparable 接口,用你自己的代码重写 compareTo() 方法,它会根据比较的结果返回负数、零或正数。您将在方法体内设置 if 条件来处理年龄相同时的情况。