学生数据模型如下:
@Data @AllArgsConstructor public class User implements Comparable<User>{ private int age; private String sex; private int grade; @Override public int compareTo(User o) { return o.getAge()-this.getAge(); } }
包括了学生年龄,性别,年级属性
有一组学生数据集合如下:
现在要求要对这组学生数据按年龄进行排序
1:利用集合框架提供的Collections.sort实现排序,其中User需要实现比较器Comparable接口,并且实现其中compareTo接口,返回的时当前入参的学生和当前这个学生的年龄差,负数,0,正数表示当前入参比本身小,相等和大,调用Collections.sort(temp);返回的排序方式为自然排序,结果如下:
2.Collections.sort还提供了两个参数的方法,第二个参数为为比价器,如下:
Collections.sort(temp, new Comparator<User>() { @Override public int compare(User o1, User o2) { return -o1.getAge()+o2.getAge(); } });
如果用这种方式实现排序,则User就不用实现Comparable,而是直接在调用sort接口时穿一个Comparator的对象,即匿名内部类,实现compare接口,如上,实现结果如下:
如果compare接口改写如下:
Collections.sort(temp, new Comparator<User>() { @Override public int compare(User o1, User o2) { return o1.getAge()-o2.getAge(); } });
则排序相反,如下:
3.如果jdk版本为Java8或者更高的版本,则可以利用java8的新特性的stream流实现排序,而且user对象无需实现compare接口,代码如下:
//3.利用Java8的stream流和Comparator实现集合排序 temp = temp.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
结果如下:
支持倒叙排序,在正序的基础上再调用reversed方法,代码如下:
temp = temp.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
结果如下:
现在如果排序要求更复杂,排序要求:先按学生年龄降序排序,年龄相等的话,则按年级升级排序!则可以利用java8的stream流实现,如下:
temp = temp.stream().sorted(Comparator.comparing(User::getAge) .reversed() .thenComparing(Comparator.comparing(User::getGrade)) ).collect(Collectors.toList());
结果如下:
如果要求排序为:先按年龄降序排序,再按年级降序排序,代码如下:
temp = temp.stream().sorted(Comparator.comparing(User::getAge) .reversed() .thenComparing(Comparator.comparing(User::getGrade).reversed()) ).collect(Collectors.toList());
结果如下:
4.如果排序对象为数组的话,则调用数组的Arrays.sort方法同样可以实现数组的排序,不过这要求user类需要实现compare接口,同集合的sort方法类似,这边不在描述。