142

我见过同时实现ComparableComparator的类。这是什么意思?为什么我要使用其中一个?

4

11 回答 11

242

以下文字来自Comparator vs Comparable

可比

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

比较器

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

于 2009-09-17T17:14:08.540 回答
157

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

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

于 2009-09-17T17:14:50.373 回答
38

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

  • 它在同一个班级(这通常是一个优势)
  • 只能有一种实现(因此,如果您需要两种不同的情况,则不能使用它)

通过比较,Comparator 是外部比较:

  • 它通常在一个唯一的实例中(在同一类或另一个地方)
  • 你用你想要的排序方式命名每个实现
  • 您可以为您无法控制的类提供比较器
  • 即使第一个对象为空,该实现也是可用的

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

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

  • Comparable<Object>让您在编译时在所有代码中使用它(如果需要,这很好,如果不需要,则不好,并且您会丢失编译时错误);您的实现必须处理对象,并根据需要以稳健的方式进行转换。
  • Comparable<Itself>相反非常严格。

有趣的是,当您将其自身子类化为子类时,子类也必须是 Comparable 并且对其具有健壮性(否则它会破坏 Liskov 原则,并给您运行时错误)。

于 2009-09-17T17:23:58.590 回答
21

java.lang.Comparable

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

    int a.compareTo(b)

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

java.util.Comparator

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

    int compare (a,b)

  2. 您构建一个与您要对其实例进行排序的类分开的类。这样就可以为每个类创建多个排序序列。
于 2012-05-17T19:12:47.117 回答
14

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

AComparator代表特定用途的排序本身。

于 2009-09-17T17:14:29.053 回答
8

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

有些类实际上提供Comparators了常见情况;例如,Strings 在排序时默认区分大小写,但也有一个Comparator名为CASE_INSENSITIVE_ORDER.

于 2009-09-17T17:15:09.640 回答
6

以下是我在网上发现的 Comparator 和 Comparable 之间的一些区别:

  1. 如果您看到那么这两者之间的逻辑区别是 Java 中的 Comparator 比较提供给他的两个对象,而 Comparable 接口将“this”引用与指定的对象进行比较。

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

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

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

网站:Java中如何使用Comparator和Comparable?举个例子

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

于 2011-09-05T01:59:45.677 回答
5

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

于 2009-09-17T17:15:44.887 回答
4

Comparator 和 Comparable 接口之间的区别

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

Comparator用于比较两种数据类型都是对象。

于 2010-10-25T16:24:08.460 回答
2

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

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

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

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

于 2012-02-14T04:30:32.477 回答
0

我用于实现 Comparable 和 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);         
    }  
} 

单击链接以查看更多示例。比较

于 2012-01-08T01:34:06.630 回答