2

我通过一些文章对收藏有了一些了解。
但是我很困惑应该在哪里实现 collections.sort() 方法以及在哪里需要使用可比较的接口(compareTo() 和比较器接口(compare())。

用于比较此和另一个参考对象的可比较接口,但用于比较两个对象的比较器。

我想知道具体哪些情况需要使用方法?

谢谢,

4

4 回答 4

2

你不应该实施Collections.sort();此方法内置于 Java 中。调用该方法而不提供 aComparator以按自然顺序排序,如果它是Comparable. 否则,提供一个Comparator排序Comparator的方式。

如果该类具有自然排序,您应该让该类实现Comparable并提供一个方法,如javadocs 中所示。一个例子是 for和,它当然有一个自然的数学排序。compareToComparableIntegerDouble

您应该创建一个实现的类,Comparator当您无法使对象的类进行排序Comparable时,或者当您想要呈现一个可以替代自然排序的排序时,或者当您想要在没有自然排序时强加一个顺序时。一个例子是颠倒自然顺序(例如,从最大到最小降序排序)。另一个例子是具有多个字段的数据对象,您希望在多个字段上可排序,例如带有and的Person对象:您可以有一个首先排序的对象,另一个首先排序的对象。firstNamelastNameComparatorlastNamefirstName

于 2013-04-08T22:41:43.547 回答
0

当我无法访问要比较的类的代码时,比较器对我来说很有意义:例如,您可能需要为 String 实现自定义比较器。

当我需要对我自己的自定义对象的列表进行排序时,我编写它们来实现接口 Comparable。

于 2013-04-08T22:40:49.960 回答
0

让我们看看我是否可以用简单的话来解释它:

compareTo()方法旨在将对象的活动实例与对象的另一个实例进行比较。所以,假设你有这个示例类:

public class Spam implements Comparable<Spam> {
    private int eggs;
    public Spam(int eggs) {
        this.eggs = eggs;
    }
    public int compareTo(Spam otherSpam) {
        return otherSpam.eggs - this.eggs;
    }
    public int getEggs() {
        return eggs;
    }
}

假设您Spam在代码中的某处使用此类:

...
if(spam1.compareTo(spam2) == 0) {
    System.out.println("Both spams are equal");
} else {
    if(spam1.compareTo(spam2) > 0)
        System.out.println("'spam2' is bigger than 'spam1'");
    else
        System.out.println("'spam2' is smaller than 'spam1'");
}
....

因此,compareTo()用于确定一个类的两个实例是否相等,如果它们不相等,则哪个更大。

这对于排序算法的重要性现在是显而易见的。如果您不知道一个对象是否大于另一个对象,您将如何对一组对象进行排序?当sort调用 的实现时,它使用compareTo()类的方法来决定集合的正确顺序。

最后,compare()当您想在类进行比较时,您可以使用该方法。一个实现是:

 public int compare(Spam s1, Spam s2) {
     return s1.getEggs() - s2.getEggs();
 }

希望这可以帮助你

于 2013-04-08T22:50:19.850 回答
0

我猜 Comparator 仅在您想按升序对类中的对象进行排序时使用。用于按升序对类的 ID 进行排序。它是基于一个字段的互斥排序自动排除基于另一个字段的排序

于 2014-01-10T18:07:04.753 回答