为什么在重写compareTo()方法时使用Comparable Interface中的compareTo()?

时间:2016-11-18 03:34:09

标签: java interface comparable

我一直在谷歌上搜索,最接近的回复(不是回答)是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;
   }
}

2 个答案:

答案 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()方法的默认实现