什么时候课程应该是可比较的和/或比较者?

Nic*_*ner 134 java comparable comparator

我见过同时实现ComparableComparator的类.这是什么意思?为什么我会使用一个而不是另一个?

Dan*_*Dan 236

以下文字来自Comparator vs Comparable

可比

可比较的对象能够将自己与另一个对象进行比较.类本身必须实现java.lang.Comparable接口才能比较其实例.

比较

比较器对象能够比较两个不同的对象.该类不是比较它的实例,而是比较其他类的实例.该比较器类必须实现该java.util.Comparator接口.

  • 另一篇好文章:http://codecramp.com/java-comparable-vs-comparator/ (2认同)

Jon*_*eet 148

实现Comparable意味着"我可以将自己与另一个对象进行比较." 当存在单个自然默认比较时,这通常很有用.

实现Comparator意味着"我可以比较其他两个对象".当有多种方法比较两种类型的实例时,这通常很有用 - 例如,您可以按年龄,姓名等比较人.

  • @ mdhar9e:周围有很多例子 - 如果你发现很难将它们转换成你的特定场景,请在新问题中提供更多信息. (5认同)
  • @alireza:我已经给第二个段落为例:由具有不同的比较,你可以进行排序相同的集合(人)由不同的属性(年龄,姓名等).你不能仅仅通过让'Person`实现`Comparable`来做到这一点,因为你不能改变*如何*两个人进行比较. (2认同)
  • @RishiKeshPathak:如果只比较一件显而易见的事情,那么使用Comparable的好处就更多了。即使这样,您也可以*编写比较器。如果您有两个使用同一类的不同程序,而一个只想按年龄排序,另一个只想按名称排序,则其中至少*一个*将需要使用比较器。 (2认同)

KLE*_*KLE 36

Comparable让一个类实现自己的比较:

  • 属于同一类(通常是一个优势)
  • 可以有只有一个实现(所以你不能使用,如果你想两种不同的情况)

相比之下,Comparator是一个外部比较:

  • 它通常在一个独特的实例中(在同一个类或在另一个地方)
  • 您可以按照要对事物进行排序的方式命名每个实现
  • 您可以为您无法控制的课程提供比较器
  • 即使第一个对象为null,该实现也是可用的

在这两种实现中,您仍然可以选择要比较的内容.使用泛型,您可以声明,并在编译时检查它.这提高了安全性,但确定适当的值也是一个挑战.

作为指导,我通常使用可以比较该对象的最通用的类​​或接口,在我设想的所有用例中......虽然定义不是很精确!:-(

  • Comparable<Object>允许你在编译时在所有代码中使用它(如果需要可以使用它,如果没有则可以使用,如果没有,则会丢失编译时错误); 您的实现必须处理对象,并根据需要进行强制转换.
  • Comparable<Itself> 相反是非常严格的.

有趣的是,当你将它自己子类化为Subclass时,Subclass也必须是Comparable并且对它是健壮的(或者它会破坏Liskov Principle,并给你运行时错误).


cod*_*hki 20

java.lang.Comparable的

  1. 要实现Comparable接口,类必须实现单个方法compareTo()

    int a.compareTo(b)

  2. 您必须修改要对其实例进行排序的类.这样每个类只能创建一个排序序列.

的java.util.Comparator

  1. 要实现Comparator接口,类必须实现单个方法 compare()

    int compare (a,b)

  2. 您构建一个与要对其实例排序的类分开的类.这样就可以为每个类创建多个排序顺序.


sta*_*lue 14

Comparable 用于在数据对象上提供默认排序,例如,如果数据对象具有自然顺序.

A Comparator表示特定用途的排序本身.


Mic*_*ers 8

Comparable通常是首选.但有时一个类已经实现了Comparable,但是你想要对不同的属性进行排序.然后你被迫使用了Comparator.

有些班级实际上提供Comparators了常见案例; 例如,Strings在排序时默认区分大小写,但也有一个静态Comparator调用CASE_INSENSITIVE_ORDER.

  • 我不确定我同意Comparable是首选.有些对象具有强烈的自然顺序感 - 即数字,各种形式:自然数,实数,日期等.但即使是其他相对原始的对象(如字符串)也缺乏普遍适用的顺序.对于更复杂的对象(如应用程序域模型中的实体),实现Comparable通常是一个错误.他们的许多财产使得很难预测最常见的订单. (7认同)

小智 6

以下是我在网上找到的Comparator和Comparable之间的一些差异:

  1. 如果你看到这两者之间的逻辑差异是Java中的Comparator比较提供给他的两个对象,而Comparable接口将"this"引用与指定的对象进行比较.

  2. Java中的可比较用于实现对象的自然排序.在Java API String中,Date和包装类实现Comparable接口.

  3. 如果任何类在Java中实现Comparable接口,那么可以使用Collections.sort()或Array.sort()方法自动对List或Array的集合进行排序,并且将根据CompareTo方法定义的自然顺序对对象进行排序.

  4. 在Java中实现Comparable的对象可以用作有序映射中的键或有序集合中的元素(例如TreeSet),而无需指定任何Comparator.

site:如何在Java中使用Comparator和Comparable?用例子

阅读更多:如何在Java中使用Comparator和Comparable?用例子


Mic*_*mlk 5

Comparable适用于具有自然顺序的对象.对象本身知道如何订购.
Comparator用于没有自然排序的对象,或者当您希望使用不同的顺序时.