哪里需要在java集合中使用collections.sort()和可比较和比较器接口?

时间:2013-04-08 22:35:46

标签: java collections

我对一些文章的收藏有所了解 但我在混淆应该在哪里实现collections.sort()方法以及需要使用类似的接口(compareTo()和比较器接口(compare())。

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

我想确切知道哪种情况需要使用方法?

谢谢,

4 个答案:

答案 0 :(得分:2)

您不应该实施Collections.sort();这个方法是built-in to Java。如果它是Comparator,则调用该方法而不提供Comparable自然顺序排序。否则,提供Comparator来排序Comparator的方式。

Comparable javadocs所示,如果类具有自然排序,则应该具有类Comparable类并提供compareTo方法。一个例子是IntegerDouble,它们当然具有自然的数学排序。

当你不能使对象的类对Comparable进行排序,或者当你想要提供一个替代自然顺序的排序时,或者当你想要对它进行排序时,你应该创建一个实现Comparator的类你想在没有自然顺序的情况下强加订单。一个例子是反转自然顺序(例如,从最大到最小的排序降序)。另一个例子是具有多个字段的数据对象,您希望在多个字段上对其进行排序,例如:一个Person firstName对象lastNameComparator:您可以先lastNamefirstName进行排序,然后再对{{1}}进行排序

答案 1 :(得分:0)

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

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

答案 2 :(得分: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();
 }

希望这有助于你

答案 3 :(得分:0)

我猜只有当你想按升序对类中的对象进行排序时才使用Comparator。用于按升序排序说出类的ID。它是基于一个字段的互斥排序,自动排除基于另一个字段的排序