13.1 经典例子

List有一个方法sort,可以给它的成员排序,但这里有一个问题,List的元素类型有可能是对象,它们按什么排序?
应对的方法就是传入一个排序策略,例如按照对象的id值排序,而这个排序策略就是一个接口,sort方法是这样声明的:
void sort(Comparator c)
Comparator是一个接口,它里面有一个方法compare,就是通过自定一个compare方法,来选取排序策略的,这个compare需要两个参数,参数类型就是要排序的数组的元素类型。假设有这样的字符串链表:
List<Stringlist=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 firstsecond;
         }
     }

由于字符串之间的比较本身就是按照ASCII顺序,所以这里直接就是first>second。
这是传统的写法,使用lambda表达式,第一个比较长短的,就是这样写了:
List<Stringlist=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 t1t2;
    
});

下面是一个更复杂的List,它的元素是一个ChapterQuizOrStudy对象,至于ChapterQuizOrStudy的细节是什么,在这里不重要。我们只需要知道Queue是一个整数。
List<ChapterQuizOrStudyresult;
/*
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();
         }
    
});