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<>());
我无法理解这种排序方法。有人可以向我解释一下吗?
答案 0 :(得分:17)
Collection.sort(l)
假设l
的内容为Comparable
。 Collection.sort(1, Comparator)
使用自定义比较器来比较l
的内容,这就是您所做的。排序的想法(包括sort()
方法)意味着对象必须具有可比性 - 在这种情况下,与Comparable
或Comparator
相对应。
请注意,许多Java对象已经具有可比性,包括String
,Date
和Number
。对于那些,您可以使用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<Circle> 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<Circle> {
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!!!!!
答案 1 :(得分:1)
Collections.sort采用比较器根据您提供的比较器对List进行排序,其他按照自然排序顺序排序。如果您想要遵循任何自定义排序顺序,则使用此方法。并没有什么可以解释的。
答案 2 :(得分:0)
使用Collections.sort(Collection)对集合进行排序以对值进行排序。此方法适用于实现Comparable
接口的用户。此接口定义方法compare
,它执行元素的成对比较,如果元素小于比较元素则返回-1,如果相等则返回0,如果相等则返回1。一个常见的例子是Integer类。
如果要对不同的内容进行排序,您可以基于Comparator
接口定义自己的实现。这种方法是您可以按任何属性甚至属性组合对任何对象进行排序。例如,如果您具有属性为income和dateOfBirth的Person类型的对象,则可以定义Comparator的不同实现,并根据您的需要对对象进行排序。