简单地改变
public int compare(Dog d, Dog d1) {
return d.age - d1.age;
}
to
public int compare(Dog d, Dog d1) {
return d1.age - d.age;
}
如果您正在寻找的话,应该按照年龄的相反顺序对它们进行排序。
Update:
@Arian 在他的评论中是正确的,为狗声明比较器的公认方法之一是将其声明为类本身的公共静态最终字段。
class Dog implements Comparable<Dog> {
private String name;
private int age;
public static final Comparator<Dog> DESCENDING_COMPARATOR = new Comparator<Dog>() {
// Overriding the compare method to sort the age
public int compare(Dog d, Dog d1) {
return d.age - d1.age;
}
};
Dog(String n, int a) {
name = n;
age = a;
}
public String getDogName() {
return name;
}
public int getDogAge() {
return age;
}
// Overriding the compareTo method
public int compareTo(Dog d) {
return (this.name).compareTo(d.name);
}
}
然后,您可以在代码中任何想要比较狗的地方使用它,如下所示:
// Sorts the array list using comparator
Collections.sort(list, Dog.DESCENDING_COMPARATOR);
实现 Comparable 时要记住的另一件重要事情是,compareTo 与 equals 的执行一致非常重要。尽管不是必需的,但不这样做可能会导致某些集合(例如集合的某些实现)出现奇怪的行为。看this http://www.javapractices.com/topic/TopicAction.do?Id=10发布有关实施compareTo的合理原则的更多信息。
更新2:克里斯是对的,这段代码很容易因年龄的大负值而溢出。在 Java 7 及更高版本中实现此功能的正确方法是Integer.compare(d.age, d1.age)
代替d.age - d1.age
.
更新3:使用 Java 8,您的比较器可以更简洁地编写为:
public static final Comparator<Dog> DESCENDING_COMPARATOR =
Comparator.comparing(Dog::getDogAge).reversed();
语法为Collections.sort
保持不变,但是compare
可以写成
public int compare(Dog d, Dog d1) {
return DESCENDING_COMPARATOR.compare(d, d1);
}