关于集合排序

起因:给了我一个需求 ,想把一个列表的排序改为字段"name  按值为APP11.x 的数据排到最上面,把剩下的"name为"APP*的排到APP11.x 的下面,剩下的数据排到最后面,  然后整体再用 name排序

一个简单的思路

把集合中新增一个字段orderTe来做临时排序字段,可通过orderTe字段来控制第一个条件正序排序,然后再按照name倒叙排序即可

demo:

public class OrderParam {
    private String name;
    private Integer age;
    private Integer orderTe;
   private static final String APPGALLY = "^APPGALLY\\d.*$";
   private static final String APPGALLYAll = "^APPGALLY.*$";
    @Override
    public String toString() {
        return "OrderParam{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", orderTe=" + orderTe +
                '}';
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }


    public Integer getOrderTe() {
        if (Pattern.matches(APPGALLY, this.name)) {
            return 1;
        } else if (Pattern.matches(APPGALLYAll, this.name)) {
            return 2;
        }
        return 3;
    }

    public void setOrderTe(Integer orderTe) {
        this.orderTe = orderTe;
    }
}

 测试: 

     OrderParam test = new OrderParam("APPGALLY11.4.1", 1);
        OrderParam test2 = new OrderParam("APPGALLY11.4.2", 1);
        OrderParam test3 = new OrderParam("APPGALLY11.3.1", 1);
        OrderParam test4 = new OrderParam("APPGALLY11.5.1", 1);
        OrderParam test5 = new OrderParam("APPGALLYuSER", 1);
        OrderParam test6 = new OrderParam("APPGALLYALL", 1);
        OrderParam test7 = new OrderParam("AOP11.5", 1);
        List<OrderParam> testList = new ArrayList<>();
        testList.add(test2);
        testList.add(test);
        testList.add(test4);
        testList.add(test3);
        testList.add(test7);
        testList.add(test5);
        testList.add(test6);
        testList.sort(Comparator.comparingInt(OrderParam::getOrderTe).reversed().thenComparing(OrderParam::getName).reversed());

  

posted @ 2021-09-16 22:31  mimimikasa  阅读(54)  评论(0)    收藏  举报