13.1 经典例子
List有一个方法sort,可以给它的成员排序,但这里有一个问题,List的元素类型有可能是对象,它们按什么排序?
应对的方法就是传入一个排序策略,例如按照对象的id值排序,而这个排序策略就是一个接口,sort方法是这样声明的:
void sort(Comparator c)
Comparator是一个接口,它里面有一个方法compare,就是通过自定一个compare方法,来选取排序策略的,这个compare需要两个参数,参数类型就是要排序的数组的元素类型。假设有这样的字符串链表:
List<String> list=new ArrayList();list.add("abcd");list.add("12");list.add("345");list.add("abcde");list.add("z");
现在需要对这个字符串链表进行排序,排序的策略是长度,短的排前面,这个时候就需要定义一个Comparator:
class LengthComparator implements Comparator{
public int compare(String first,String second){
return first.length()-second.length();
}
}
LengthComparator是接口Comparator的一个实现,这个接口只有一个方法compare需要实现。
然后就可以用在上面的排序上了:
list.sort(new LengthComparator());
调用完后就按照字符串从短到长排序了。
假如排序是按照ASCII码表的顺序来排,那么“12”会排前面,“abcd”会排在“z”前面,那么这个排序实现就应该是这样:
class ASCIIComparator implements Comparator{
public int compare(String first,String second){
return first> second;
}
}
由于字符串之间的比较本身就是按照ASCII顺序,所以这里直接就是first>second。
这是传统的写法,使用lambda表达式,第一个比较长短的,就是这样写了:
List<String> list=new ArrayList();list.add("abcd");list.add("12");list.add("345");list.add("abcde");list.add("z");list.sort((t1,t2)-> { return t1.length()-t2.length();});
而按照ASCII码比较的就这么写:
list.sort((t1,t2)-> {
return t1> t2;
});
下面是一个更复杂的List,它的元素是一个ChapterQuizOrStudy对象,至于ChapterQuizOrStudy的细节是什么,在这里不重要。我们只需要知道Queue是一个整数。
List<ChapterQuizOrStudy> result;/*
result获取值,略
*/
result.sort(new Comparator(){
@Overridepublic int compare(ChapterQuizOrStudy o1,ChapterQuizOrStudy o2){
ChapterQuiz cq1=o1.getChapterQuiz();
ChapterQuiz cq2=o2.getChapterQuiz();
return cq1.getQueue()-cq2.getQueue();
}
});