哪里需要在java集合中使用collections.sort()和comparable与comparator接口?

哪里需要在java集合中使用collections.sort()和comparable与comparator接口?,java,collections,Java,Collections,通过一些文章,我对收藏有了一些了解。 但是我弄不清楚应该在哪里实现collections.sort()方法,以及哪里需要使用comparable接口(compareTo()和comparator接口(compare()) 用于比较此参考对象和另一参考对象的可比接口,但用于比较两个对象的比较器 我想知道具体哪种情况需要使用方法 谢谢,当我无法访问要比较的类的代码时,Comparator对我来说是有意义的:例如,您可能需要为String实现一个自定义的Comparator 当我需要对自己的自定义对象

通过一些文章,我对收藏有了一些了解。
但是我弄不清楚应该在哪里实现collections.sort()方法,以及哪里需要使用comparable接口(compareTo()和comparator接口(compare())

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

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


谢谢,

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


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

您不应该实现
集合。sort()
;此方法为。调用该方法时,如果
可比较,则不提供
比较器
按自然顺序进行排序。否则,提供
比较器
比较器
进行排序

您应该让类实现
Comparable
,如果类具有自然顺序,则应提供
compareTo
方法,如javadocs中所示。例如
Integer
Double
,它们当然具有自然的数学顺序


您应该创建一个类,当您无法使对象的类进行排序
比较时,或者当您想要呈现一个替代自然排序的排序时,或者当您想要在没有自然排序的情况下强加一个排序时,应该实现该类。例如,反转自然排序(例如,从大到小按降序排序)。另一个例子是具有多个字段的数据对象,您希望在多个字段上进行排序,例如,具有
名字和
姓氏的
Person
对象:您可以有一个
比较器
,该比较器首先对
姓氏进行排序,另一个比较器首先对
姓氏进行排序。

L让我们看看我是否能用简单的话来解释:

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;
    }
}
因此,
compareTo()
用于确定一个类的两个实例是否相等,如果不相等,则确定哪个实例更大

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

最后,当您希望在类外执行比较时,可以使用
compare()
方法

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

希望这对您有所帮助

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

如果类具有自然顺序,请将其与使用compareTo方法实现该顺序。排序时,如果要对不可比数据进行排序,或需要按可比类型的自然顺序以外的顺序进行排序,请使用Comparator。
 public int compare(Spam s1, Spam s2) {
     return s1.getEggs() - s2.getEggs();
 }