原文出自《Java核心技术卷一第10版》
6.1.1节中,我们已经了解了如何对一个对象数组排序,前提是这些对象是实现了Comparable接口的类的实例。例如,可以对一个字符串数组排序,因为String类实现了Comparable<String>,而且String.compareTo方法可以按字典顺序比较字符串。
现在假设我们希望按长度递增的顺序对字符串进行排序,而不是按字典顺序进行排序。肯定不能让String类用两种不同的方式实现compareTo方法——更何况,String类也不应由我们来修改。
要处理这种情况,Arrays.sort方法还有第二个版本,有一个数组和一个比较器(comparator)作为参数,比较器是实现了Comparator接口的类的实例。
要按长度比较字符串,可以如下定义一个实现Comparator<String>的类:
public class LengthComparator implements Comparator<String> {
@Override
public int compare(String first, String second) {
return first.length() - second.length();
}
}
具体完成比较时,需要建立一个实例:
将这个调用与words[i].compareTo(words[j])做比较。这个compare方法要在比较器对象上调用,而不是在字符串本身上调用。
注释:尽管LengthComparator对象没有状态,不过还是需要建立这个对象的一个实例。我们需要这个实例来调用compare方法——它不是一个静态方法。
要对一个数组排序,需要为Arrays.sort方法传入一个LengthComparator对象:
现在这个数组可能是["Paul", "Mary", "Peter"]或["Mary", "Paul", "Peter"]。
在6.3节中我们会了解,利用lambda表达式可以更容易地使用Comparator。
完整代码
public class LengthComparator implements Comparator<String> {
@Override
public int compare(String first, String second) {
return first.length() - second.length();
}
}
public class Test {
public static void main(String[] args) {
Comparator<String> comp = new LengthComparator();
//if (comp.compare(words[i], words[j]) > 0);
String[] friends = {"Peter", "Paul", "Mary"};
Arrays.sort(friends, new LengthComparator());
System.out.println(Arrays.toString(friends));
}
}
运行结果