Collections.sort()使用比较器?

import java.util.*; public class C_2 { public static void main(String args[]) { String theStrings[] = { "x", "a", "b", "c", "d" }; List l = Arrays.asList(theStrings); Collections.sort(l); // line a Collections.sort(l, new ThisIsMyThing()); // line b System.out.println(l); } } class ThisIsMyThing implements Comparator { public int compare(Object o1, Object o2) { String s1 = (String)o1; String s2 = (String)o2; return -1 * s1.compareTo(s2); } } 

我知道C_2类基于两种不同的技术进行排序。 一个是标准的Collections.sort(l); 另一个是Collections.sort(l,Comparator()); 我无法理解这种排序方法。 有人可以向我解释一下吗?

Collection.sort(l)假定Collection.sort(l)的内容是ComparableCollection.sort(1, Comparator)使用自定义比较器来比较l的内容,这就是你所做的。 排序的想法(包括sort()方法)意味着对象必须是可比较的 – 在这种情况下,与ComparableComparator

请注意,许多Java对象已经具有可比性,包括StringDateNumber 。 对于那些,你可以只使用Collection.sort(someList);

假设你有一个Circle课程

 public class Circle { double radius; public Circle(double radius) { this.radius = radius; } public double getArea(){ return radius * radius * Math.PI; } } 

如果您创建了100个Circle对象:

 ArrayList circleList = new ArrayList<>(); for (int i = 0; i < 100; i++) { // adds a circle with random radius circleList.add(new Circle((int)(Math.random() * 100))); } // try to sort the list Collections.sort(circleList); //compilation error: must be Comparable 

您无法对它们进行排序,因为Java不知道如何比较它们。 你必须告诉Java:

 public class Circle implements Comparable { double radius; public Circle(double radius) { this.radius = radius; } // you MUST override the compareTo method from the Comparable interface @Override public int compareTo(Circle cirlce){ if (this.getArea() > circle.getArea()) return 1; else if (this.getArea() == circle.getArea()) return 0; else return -1; } public double getArea(){ return radius * radius * Math.PI; } } 

使用Circle类中的compareTo()方法,Java现在知道如何比较它们并对它们进行排序。

现在你可以这样做:

 Collections.sort(circleList); // Yayyy I'm being sorted by the size of my areas!!!!! 

Collections.sort采用比较器根据您提供的比较器对List进行排序,其他遵循自然排序顺序。这就是如果您想要遵循任何自定义排序顺序,那么使用此方法。 没有什么可以解释的。

使用此链接进行说明。

使用Collections.sort(Collection)对集合进行排序以对值进行排序。 此方法适用于实现Comparable接口的人员。 此接口定义方法compare ,它执行元素的成对比较,如果元素小于比较元素则返回-1,如果相等则返回0,如果相等则返回1。 一个常见的例子是Integer类。

如果要进行不同的排序,您可以基于Comparator接口定义自己的实现。这种方法是您可以通过任何属性甚至属性组合对任何对象进行排序。 例如,如果您具有属性为income和dateOfBirth的Person类型的对象,则可以定义Comparator的不同实现,并根据您的需要对对象进行排序。