常用List集合排序总结

常用List集合排序总结

一、创建两个测试对象

创建两个常用的排序对象

//对象一
@Data
public class Org {

    private String name;

    private Integer age;

    public Org(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
//对象二
@Data
public class Org2 {

    private String name;

    private Integer age;

    private Integer fraction;

    public Org2(String name, Integer age, Integer fraction) {
        this.name = name;
        this.age = age;
        this.fraction = fraction;
    }
}

二、测试对象

//对象一
        List<Org> orgList = new ArrayList<>();
        orgList.add(new Org("zhangsan1",6));
        orgList.add(new Org("zhangsan2",15));
        orgList.add(new Org("zhangsan3",14));
        orgList.add(new Org("zhangsan4",22));
        orgList.add(new Org("zhangsan5",2));
        orgList.add(new Org("zhangsan6",18));
        orgList.add(new Org("zhangsan7",56));

//对象二
        List<Org2> org2List = new ArrayList<>();
        org2List.add(new Org2("zhangsan1",6,55));
        org2List.add(new Org2("zhangsan2",6,66));
        org2List.add(new Org2("zhangsan3",16,96));
        org2List.add(new Org2("zhangsan4",5,12));
        org2List.add(new Org2("zhangsan5",22,23));
        org2List.add(new Org2("zhangsan6",22,44));
        org2List.add(new Org2("zhangsan7",35,78));

//单属性集合
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(16);
        list.add(12);
        list.add(13);
        list.add(11);
        list.add(19);

三、排序方法

1、Collections的排序

 //单一属性排序,顺序
 Collections.sort(list);
        list.forEach( s ->{
            System.out.println(s);
        });
        
 //单一属性排序,倒序
 Collections.reverse(list);
        list.forEach( s ->{
            System.out.println(s);
        });

2、Comparator的排序

//单一属性的倒序
List<Integer> collect = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
        collect.forEach( s ->{
            System.out.println(s);
        });

3、Comparator的排序(对象)

 //根据对象属性顺序
orgList.sort(Comparator.comparing(Org::getAge));
        orgList.forEach( s -> {
            System.out.println(s.toString() + "->"+s.getAge());
        });
        
 //根据对象属性倒序
 orgList.sort((m1, m2) -> m2.getAge().compareTo(m1.getAge()));
        orgList.forEach( s -> {
            System.out.println(s.toString() + "->"+s.getAge());
        });
        
//对象属性倒序 - > reversed()方法倒序,去掉顺序
List<Org> collect1 = orgList.stream()
                .sorted(Comparator.comparing(Org::getAge).reversed())
                .collect(Collectors.toList());
        collect1.forEach( s -> {
            System.out.println(s.toString() + "->"+s.getAge());
        });

//多属性排序thenComparing - > reversed()方法倒序,去掉顺序
/*thenComparing可以无限拼接排序规则,先按照前面的排序再按照后面的排序,
如果全部按照统一排序,只需要在最后加上reversed()倒序,或者不加顺序*/
List<Org2> collect2 = org2List.stream()
                .sorted(Comparator.comparing(Org2::getAge).thenComparing(Org2::getFraction).reversed())
                .collect(Collectors.toList());
        collect2.forEach( s -> {
            System.out.println(s.toString() + "->"+s.getAge());
        });

//如果每个排序都要按照特定的方式排序,则需要在每个属性后面加上对应的排序规则,例子前面倒序后面顺序。
List<Org2> collect3 = org2List.stream()
                .sorted(Comparator.comparing(Org2::getAge).reversed().thenComparing(Org2::getFraction))
                .collect(Collectors.toList());
        collect3.forEach( s -> {
            System.out.println(s.toString() + "->"+s.getAge());
        });

//如果每个排序都要按照特定的方式排序,则需要在每个属性后面加上对应的排序规则,例子前面顺序后面倒序。
/*特殊情况:最后一个属性倒序,由于最后一个属性的.reversed()为全部属性的排序规则,
那么前面的属性排序规则就正好相反,就和负负得正情况一样,前面属性的正序就会变成倒序,倒序就会变成正序*/
//下面就是按照前面属性的正序,后面属性的倒序规则排序
List<Org2> collect4 = org2List.stream()
                .sorted(Comparator.comparing(Org2::getAge).reversed().thenComparing(Org2::getFraction).reversed())
                .collect(Collectors.toList());
        collect4.forEach( s -> {
            System.out.println(s.toString() + "->"+s.getAge());
        });

以上方法自测无误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值