我通过一些文章对收藏有了一些了解。
但是我很困惑应该在哪里实现 collections.sort() 方法以及在哪里需要使用可比较的接口(compareTo() 和比较器接口(compare())。
用于比较此和另一个参考对象的可比较接口,但用于比较两个对象的比较器。
我想知道具体哪些情况需要使用方法?
谢谢,
我通过一些文章对收藏有了一些了解。
但是我很困惑应该在哪里实现 collections.sort() 方法以及在哪里需要使用可比较的接口(compareTo() 和比较器接口(compare())。
用于比较此和另一个参考对象的可比较接口,但用于比较两个对象的比较器。
我想知道具体哪些情况需要使用方法?
谢谢,
你不应该实施Collections.sort()
;此方法内置于 Java 中。调用该方法而不提供 aComparator
以按自然顺序排序,如果它是Comparable
. 否则,提供一个Comparator
排序Comparator
的方式。
如果该类具有自然排序,您应该让该类实现Comparable
并提供一个方法,如javadocs 中所示。一个例子是 for和,它当然有一个自然的数学排序。compareTo
Comparable
Integer
Double
您应该创建一个实现的类,Comparator
当您无法使对象的类进行排序Comparable
时,或者当您想要呈现一个可以替代自然排序的排序时,或者当您想要在没有自然排序时强加一个顺序时。一个例子是颠倒自然顺序(例如,从最大到最小降序排序)。另一个例子是具有多个字段的数据对象,您希望在多个字段上可排序,例如带有and的Person
对象:您可以有一个首先排序的对象,另一个首先排序的对象。firstName
lastName
Comparator
lastName
firstName
当我无法访问要比较的类的代码时,比较器对我来说很有意义:例如,您可能需要为 String 实现自定义比较器。
当我需要对我自己的自定义对象的列表进行排序时,我编写它们来实现接口 Comparable。
让我们看看我是否可以用简单的话来解释它:
该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();
}
希望这可以帮助你
我猜 Comparator 仅在您想按升序对类中的对象进行排序时使用。用于按升序对类的 ID 进行排序。它是基于一个字段的互斥排序自动排除基于另一个字段的排序