list中只有数字或者字符串
Collections.sort(list);
//逆序排序
Collections.sort(list,Collections.reverseOrder());
String类型的排序,先排数字,再排字母,默认排序方式是升序
list中存放对象
在Jdk1.8之后可以用此方法,
//按照List中对象的id属性升序
list.sort(Comparator.comparing(Stu::getId))
//按照List中对象的id属性降序
list.sort(Comparator.comparing(Stu::getId).reversed());
//多条件升序
list.sort(Comparator.comparing(Stu::getId).thenComparing(Stu::getSid));
//id降序
list.sort(Comparator.comparing(Stu::getId).reversed().thenComparing(Stu::getSid))
list.sort(Comparator.comparing(Stu::getId).reversed().thenComparing(Stu::getSid))
list.sort(Comparator.comparing(Stu::getId).thenComparing(Stu::getSid).reversed());
这两者是否有区别?
多条件排序后,会不会把原有的实体类拆分再排序。
Stu stu1 = new Stu(1,5,"张一");
Stu stu2 = new Stu(2,4,"张二");
Stu stu3 = new Stu(3,3,"张三");
Stu stu4= new Stu(4,2,"张四");
Stu stu5 = new Stu(5,1,"张五");
List<Stu> list = new ArrayList<>();
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
list.add(stu5);
list.sort(Comparator.comparing(Stu::getId).thenComparing(Stu::getSid).reversed());
list.forEach(x->{
System.out.println(x);
});
System.out.println("================");
list.sort(Comparator.comparing(Stu::getId).reversed().thenComparing(Stu::getSid));
list.forEach(x->{
System.out.println(x);
});
控制台打印如下:可以看出都是根据id降序,这两者并没有区别,并且不会把实体类拆分。
Stu{id=5, sid=1, name=‘张五’}
Stu{id=4, sid=2, name=‘张四’}
Stu{id=3, sid=3, name=‘张三’}
Stu{id=2, sid=4, name=‘张二’}
Stu{id=1, sid=5, name=‘张一’}
================
Stu{id=5, sid=1, name=‘张五’}
Stu{id=4, sid=2, name=‘张四’}
Stu{id=3, sid=3, name=‘张三’}
Stu{id=2, sid=4, name=‘张二’}
Stu{id=1, sid=5, name=‘张一’}
Comparator.comparing源码分析
Comparator.comparing()点进去可以看到,主要是用了compareTo方法
点compareTo方法进去之后发现它是Comparable接口的唯一方法
compareTo的实现类有很多,我debug了一下发现,上面调用的是Intager下的compareTo方法然后又调用了compare方法:
可以看到如果第一个比第二个小,就返回-1,如果第一个比第二个大就返回1。
不仅仅是Int类型比较还有String类型的比较
在jdk1.8之前我们列表比较字符串通过以下方式都是调用java.lang.String下的compareTo方法,并且String也是实现了Comparable接口的compareTo方法。
Collections.sort(list, new Comparator<Stu>() { @Override public int compare(Stu o1, Stu o2) { return o1.getName().compareTo(o2.getName()); } });
点入进去可以发现就是char类型之间的相加减,如果是负数肯定是第一个参数小,如果是正数就是第二个参数小,这样一比较就可以进行排序。