我对一些文章的收藏有所了解 但我在混淆应该在哪里实现collections.sort()方法以及需要使用类似的接口(compareTo()和比较器接口(compare())。
用于比较此参考对象和另一个参考对象的可比较接口,但用于比较两个对象的比较器。
我想确切知道哪种情况需要使用方法?
谢谢,
答案 0 :(得分:2)
您不应该实施Collections.sort()
;这个方法是built-in to Java。如果它是Comparator
,则调用该方法而不提供Comparable
按自然顺序排序。否则,提供Comparator
来排序Comparator
的方式。
如Comparable
javadocs所示,如果类具有自然排序,则应该具有类Comparable
类并提供compareTo
方法。一个例子是Integer
和Double
,它们当然具有自然的数学排序。
当你不能使对象的类对Comparable
进行排序,或者当你想要提供一个替代自然顺序的排序时,或者当你想要对它进行排序时,你应该创建一个实现Comparator
的类你想在没有自然顺序的情况下强加订单。一个例子是反转自然顺序(例如,从最大到最小的排序降序)。另一个例子是具有多个字段的数据对象,您希望在多个字段上对其进行排序,例如:一个Person
firstName
对象lastName
和Comparator
:您可以先lastName
对firstName
进行排序,然后再对{{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。它是基于一个字段的互斥排序,自动排除基于另一个字段的排序