Java集合list的排序方法

学生数据模型如下:

@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.利用Java8stream流和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方法类似,这边不在描述。


猜你喜欢

转载自blog.csdn.net/llf_1241352445/article/details/81002477
今日推荐