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

问题描述 投票:131回答:11

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

java comparator comparable
11个回答
224
投票

以下文字来自Comparator vs Comparable

可比

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

比较

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


2
投票

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

Java中的Comparable用于实现对象的自然排序。在Java API String中,Date和wrapper类实现Comparable接口。

如果任何类在Java中实现Comparable接口,则可以使用ComparableList方法自动对该对象的集合ArrayCollections.sort()进行排序,并且将根据Array.sort()方法定义的自然顺序对对象进行排序。

在Java中实现compareTo的对象可以用作有序映射中的键或有序集合中的元素,例如Comparable,而不指定任何TreeSet


0
投票

我的实现Comparable和Comparator的注释库:

Comparator

单击链接以查看更多示例。 public class Person implements Comparable<Person> { private String firstName; private String lastName; private int age; private char gentle; @Override @CompaProperties({ @CompaProperty(property = "lastName"), @CompaProperty(property = "age", order = Order.DSC) }) public int compareTo(Person person) { return Compamatic.doComparasion(this, person); } }


138
投票

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

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


36
投票

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

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

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

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

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

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

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

有趣的是,当你将它自己子类化为子类时,子类也必须是可比较的并且对它是健壮的(或者它会破坏Liskov原理,并给你运行时错误)。


19
投票

java.lang.Comparable的

  1. 要实现Comparable接口,类必须实现单个方法compareTo() int a.compareTo(b)
  2. 您必须修改要对其实例进行排序的类。这样每个类只能创建一个排序序列。

的java.util.Comparator

  1. 要实现Comparator接口,类必须实现单个方法compare() int compare (a,b)
  2. 您构建一个与要对其实例排序的类分开的类。这样就可以为每个类创建多个排序顺序。

14
投票

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

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


8
投票

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

有些班级实际上为普通案件提供Comparators;例如,Strings在排序时默认区分大小写,但是还有一个名为Comparator的静态CASE_INSENSITIVE_ORDER


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?用例子

阅读更多:How to use Comparator and Comparable in Java? With example


5
投票

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


4
投票

比较器和可比接口之间的区别

Comparable用于通过使用另一个对象来比较自己。

qazxsw poi用于比较两种数据类型是对象。

© www.soinside.com 2019 - 2024. All rights reserved.