我一直在谷歌上搜索,最接近的回复(不是回答)是here,但我对回应感到困惑。我正在尝试使用Collection.sort()对一些狗名称进行排序,因此我需要学习使用Comparable接口。我的问题:
1)当我"覆盖"为什么我需要使用来自界面的compareTo()? compareTo()?
2)如果Comparable接口的compareTo()是默认方法,为什么它没有"默认"方法前的关键字? Java SE 8 Menu
以下是部分代码:
Collections.sort(list);
for(Dog a: list) // printing the sorted list of names
System.out.print(a.getDogName() + ", ");
这是类实现Comparable接口:
class Dog implements Comparator<Dog>, Comparable<Dog> {
private String name;
private int age;
Dog() {}
Dog(String n, int a) {
name = n; age = a;
}
public String getDogName() {
return name;
}
public int getDogAge() {
return age;
}
public int compareTo(Dog d) {
return (this.name).compareTo(d.name); //###.....my question
}
// Override Comparator Interface's compare() to sort "ages"
public int compare(Dog d, Dog d1) {
return d.age - d1.age;
}
}
答案 0 :(得分:1)
这里需要考虑的事情。
其他Dog
Comparable
Dog
。它本身不是比较两个其他 Dog
的东西。
因此,实施Comparable
是#34;更正确&#34;。
你和两种方法相冲突。
static <T extends Comparable<? super T>> void sort(List<T> list)
按照升序对指定列表按升序排序 其元素的自然排序。
因此,Collections.sort(dogs);
会对您的列表进行排序。
static <T> void sort(List<T> list, Comparator<? super T> c)
根据引发的顺序对指定的列表进行排序 指定比较器。
这是您使用该方法的方式。
Collections.sort(dogs, new Comparator<Dog>() {
@Override
public int compare(Dog d1, Dog d2) {
return d1.compareTo(d2); // Call the Comparable method
}
)};
当然,您可以按年龄实施内部方法
return Integer.compare(d1.getAge(), d2.getAge());
答案 1 :(得分:0)
为什么我需要使用来自界面的compareTo() “覆盖”compareTo()?
因此,您可以根据所使用的数据结构自定义逻辑,因此在您的情况下,您使用的Dog对象无法通过Collection API进行默认排序,因为它们只处理原始数据类型排序,而不是自定义对象。 / p>
因此它要求覆盖compareTo()并提供自定义逻辑,因为您的排序关键字是字符串“name”,您可以使用其compareTo()方法进行排序。
2)如果Comparable接口的compareTo()是默认方法, 为什么它不在方法前面有“默认”关键字?
因为在原始数据类型的情况下,排序Collections.sort()
在内部使用Arrays.sort()
并且在Comparable接口中没有compareTo()方法的默认实现