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

 

发布了31 篇原创文章 · 获赞 16 · 访问量 6万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览