为什么在覆盖 compareTo() 方法时使用 Comparable 接口中的 compareTo()?
Why use compareTo() from Comparable Interface when overriding the compareTo() method?
我一直在谷歌搜索,最接近的回复(不是答案)是 here,但我对回复感到困惑。我正在尝试使用 Collection.sort() 对一些狗名进行排序,因此我需要学习使用 Comparable 接口。我的问题:
1) 当我 "override" compareTo() 时为什么需要使用来自接口的 compareTo()?
2)如果 Comparable 接口的 compareTo() 是默认方法,为什么它的方法前面没有 "default" 关键字? Java SE 8 Menu
这是部分代码:
Collections.sort(list);
for(Dog a: list) // printing the sorted list of names
System.out.print(a.getDogName() + ", ");
这里是 class 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;
}
}
why I need to use the compareTo() that came from the interface when I
"override" the compareTo()?
这样您就可以根据您使用的数据结构自定义逻辑,因此在您的情况下,您使用的是 Dog 对象,该对象无法按集合 API 默认排序,因为它们仅适用于原始数据类型排序不在自定义对象上。
因此它要求覆盖 compareTo() 并提供自定义逻辑,因为您的排序关键字是字符串 "name" 您可以使用其 compareTo() 方法进行排序。
2) If the compareTo() from Comparable interface is a default method,
why doesn't it has a "default" keyword in front of the method?
因为在原始数据类型排序的情况下 Collections.sort()
内部使用 Arrays.sort()
并且 Comparable 接口中没有默认实现 compareTo() 方法
这里有一些事情要考虑。
一个Dog
对其他Dog
是Comparable
。它本身并不是比较两个 other Dog
的东西。
因此,实施 Comparable
是 "more correct"。
而且您在两种方法之间存在冲突。
static <T extends Comparable<? super T>> void sort(List<T> list)
Sorts the specified list into ascending order, according to the
natural ordering of its elements.
因此,Collections.sort(dogs);
将对您的列表进行排序。
static <T> void sort(List<T> list, Comparator<? super T> c)
Sorts the specified list according to the order induced by the
specified comparator.
这就是您使用该方法的方式。
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());
我一直在谷歌搜索,最接近的回复(不是答案)是 here,但我对回复感到困惑。我正在尝试使用 Collection.sort() 对一些狗名进行排序,因此我需要学习使用 Comparable 接口。我的问题:
1) 当我 "override" compareTo() 时为什么需要使用来自接口的 compareTo()?
2)如果 Comparable 接口的 compareTo() 是默认方法,为什么它的方法前面没有 "default" 关键字? Java SE 8 Menu
这是部分代码:
Collections.sort(list);
for(Dog a: list) // printing the sorted list of names
System.out.print(a.getDogName() + ", ");
这里是 class 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;
}
}
why I need to use the compareTo() that came from the interface when I "override" the compareTo()?
这样您就可以根据您使用的数据结构自定义逻辑,因此在您的情况下,您使用的是 Dog 对象,该对象无法按集合 API 默认排序,因为它们仅适用于原始数据类型排序不在自定义对象上。
因此它要求覆盖 compareTo() 并提供自定义逻辑,因为您的排序关键字是字符串 "name" 您可以使用其 compareTo() 方法进行排序。
2) If the compareTo() from Comparable interface is a default method, why doesn't it has a "default" keyword in front of the method?
因为在原始数据类型排序的情况下 Collections.sort()
内部使用 Arrays.sort()
并且 Comparable 接口中没有默认实现 compareTo() 方法
这里有一些事情要考虑。
一个Dog
对其他Dog
是Comparable
。它本身并不是比较两个 other Dog
的东西。
因此,实施 Comparable
是 "more correct"。
而且您在两种方法之间存在冲突。
static <T extends Comparable<? super T>> void sort(List<T> list)
Sorts the specified list into ascending order, according to the natural ordering of its elements.
因此,Collections.sort(dogs);
将对您的列表进行排序。
static <T> void sort(List<T> list, Comparator<? super T> c)
Sorts the specified list according to the order induced by the specified comparator.
这就是您使用该方法的方式。
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());