虽然Comparable应该捕捉一个类的自然顺序,但也可以想象不自然的顺序。所以:在下面提供的方框中,重新实现compareTo()方法,以便一个婴儿小于另一个,如果他或她的名字的长度小于另一个。
public class Infant implements Comparable {
private String name;
private int age; // in months
public Infant(String who, int months) {
name = who;
age = months;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void anotherMonth() {
age = age + 1;
}
这就是我所拥有的,但我不明白
public int compareTo(Object other) {
String b = ((Infant)other).getName();
String a = this.name;
return a.compareTo(b);
}
答案 0 :(得分:2)
compareTo
允许您定义两个对象相互比较的结果......
因此,对于您的示例,您可以使用...
public int compareTo(Object other) {
String b = ((Infant)other).getName();
String a = this.name;
return(a.length() - b.length());
}
一般来说,我个人会创建“目的”构建Comparable
,允许您根据需要更改默认行为。
因此,您可以定义一个ByNameLengthComparable
和/或ByAgeComparable
,例如Arrays#sort
和Collections#sort
可能会过去......
答案 1 :(得分:0)
听起来你想要两个排序 - 自然排序和另类排序。这是Comparable
和Comparator
的用途。
现在完全取决于你,但是我只想说我希望Infant
的自然顺序是年龄,而备用顺序是名称的长度。
然后你可以利用泛型来做到这一点:
public class Infant implements Comparable<Infant> {
//Stuff
public int compareTo(Infant other) {
return new Integer(age).compareTo(other.age);
//or you can of course do the primitive comparisons but I'm lazy
//and don't hate autoboxing
}
}
然后你可以也这样做:
public class InfantNameLengthComparator implements Comparator<Infant> {
int compare(Infant first, Infant second) {
return new Integer(first.getName().length()).compareTo(second.getName().length());
}
}
然后你可以用两种方式排序:
Collections.sort(listOfInfants);
按年龄 - 默认,自然顺序
Collections.sort(listOfInfants, new InfantNameLengthComparator());
您甚至可以添加其他Comparator
来按名称按字母顺序执行其他排序,同时始终按年龄保留自然顺序。
因此,您可以同时使用Comparable
和Comparator
来提供自然顺序和备用顺序。
如果您愿意,可以查看我们最近对此确切主题所做的tutorial。
希望这有帮助。