Interface Comparator<T>
對(duì)任意類型集合對(duì)象進(jìn)行整體排序,排序時(shí)將此接口的實(shí)現(xiàn)傳遞給Collections.sort方法或者Arrays.sort方法排序.
實(shí)現(xiàn)int compare(T o1, T o2);方法,返回正數(shù),零,負(fù)數(shù)各代表大于,等于,小于。
單一條件排序:
舉例:
List<Student> stus = new ArrayList<Student>(){
{
add(new Student("張三", 30));
add(new Student("李四", 20));
add(new Student("王五", 60));
}
};
//對(duì)users按年齡進(jìn)行排序
Collections.sort(stus, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// 升序
//return s1.getAge()-s2.getAge();
return s1.getAge().compareTo(s2.getAge());
// 降序
// return s2.getAge()-s1.getAge();
// return s2.getAge().compareTo(s1.getAge());
}
});
// 輸出結(jié)果
...
注: 還可以使用lambda表達(dá)式簡(jiǎn)化代碼, 前提是JDK8開發(fā)環(huán)境, 如下:
List<Student> stus = new ArrayList<Student>(){
{
add(new Student("張三", 30));
add(new Student("李四", 20));
add(new Student("王五", 60));
}
};
//對(duì)users按年齡進(jìn)行排序
Collections.sort(stus, (s1,s2)->(s1.getAge()-s2.getAge()));
lambda表達(dá)式是JDK8新特性之一, 允許你通過(guò)表達(dá)式來(lái)代替功能接口; 細(xì)節(jié)請(qǐng)自行百度… 我也是剛接觸, 啊哈哈, 不熟悉,諒解諒解
多條件排序:
舉例:
List<Student> stus = new ArrayList<Student>(){
{
add(new Student("張三", 30, 1));
add(new Student("李四", 20, 2));
add(new Student("王五", 40, 3));
add(new Student("趙六", 30, 4));
add(new Student("陳七", 40, 5));
add(new Student("周八", 20, 6));
}
};
Collections.sort(stus,new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int flag;
// 首選按年齡升序排序
flag = s1.getAge()-s2.getAge();
if(flag==0){
// 再按學(xué)號(hào)升序排序
flag = s1.getNum()-s2.getNum();
}
return flag;
}
});
System.out.println("年齡 學(xué)號(hào) 姓名 ");
for(Student s : stus){
System.out.println(s.getAge()+" "+s.getNum()+" "+s.getName());
}
輸出結(jié)果:

自定義條件排序
String[] order = {"語(yǔ)文","數(shù)學(xué)","英語(yǔ)","物理","化學(xué)","生物","政治","歷史","地理","總分"};
final List<String> definedOrder = Arrays.asList(order);
List<String> list = new ArrayList<String>(){
{
add("總分");
add("英語(yǔ)");
add("政治");
add("總分");
add("數(shù)學(xué)");
}
};
Collections.sort(list,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int io1 = definedOrder .indexOf(o1);
int io2 = definedOrder .indexOf(o2);
return io1-io2;
}
});
for(String s:list){
System.out.print(s+" ");
}
使用lambda表達(dá)式簡(jiǎn)化代碼:
Collections.sort(list, (o1, o2)->(definedOrder .indexOf(o1)-definedOrder .indexOf(o2)));
輸出結(jié)果:

|