java关于集合自定义排序:根据一个集合的list的顺序排另外一个集合的顺序

java关于集合自定义排序:根据一个集合的list的顺序排另外一个集合的顺序

最近工作中遇到一个需求大概意思是用户可以自定义的去变换移动某种资源的顺序(即随意变换id集合的顺序)java中是可以用sort去实现的:

User对象:

 /**
    * 用户唯一标识主键
    */
    private String uid;

    /**
    * 用户名
    */
    private String userName;

实现:

public static void setOrderByList(List<String> orderRule, List<User> userList) {

    userList.sort((u1, u2) -> {
        int i1 = orderRule.indexOf(u1.getUid());

        int i2 = orderRule.indexOf(u2.getUid());

        return i1 - i2;
    });
}

orderRule就是排序的规则 如果排序规则少于userList的size 那多于的会按照原来的先后排在前面,那如果想不在排序规则里面的 排在后面呢 可以这样:

public static void setOrderByList(List<String> orderRule, List<User> userList) {

    userList.sort((u1, u2) -> {
        int i1 = orderRule.indexOf(u1.getUid());

        int i2 = orderRule.indexOf(u2.getUid());


        if (i1 != -1) {

            i1 = userList.size() - i1;

        }

        if (i2 != -1) {

            i2 = userList.size() - i2;

        }
        return i2 - i1;
    });

用列:

User build = User.builder().userName("userName1").uid("uid1").build();
User build1 = User.builder().userName("userName2").uid("uid2").build();
User build2 = User.builder().userName("userName3").uid("uid3").build();
User build3 = User.builder().userName("userName4").uid("uid4").build();
List<User> userList = new ArrayList<>();
userList.add(build);
userList.add(build1);
userList.add(build2);
userList.add(build3);
System.out.println("自由排序前:");
System.out.println(userList);


List<String> orderRule = Arrays.asList("uid4", "uid1");

OrderByUtils.setOrderByList(orderRule, userList);
System.out.println("自由排序后");
System.out.println(userList);

打印:

自由排序前:
[User(uid=uid1, userName=userName1), User(uid=uid2, userName=userName2), User(uid=uid3, userName=userName3), User(uid=uid4, userName=userName4)]
自由排序后
[User(uid=uid4, userName=userName4), User(uid=uid1, userName=userName1), User(uid=uid2, userName=userName2), User(uid=uid3, userName=userName3)]

如果在业务中频繁用到自由排序,且业务主键相同的情况可以用泛型+反射写一个通用方法,比如业务中主键名都为id则可以

public static <T> void setOrderByList(List<String> orderRule, List<T> list) {

    list.sort(((u1, u2) -> {

        int i1 = 0;
        int i2 = 0;
        try {
            i2 = orderRule.indexOf(u2.getClass().getMethod("getId").invoke(u2));
            i1 = orderRule.indexOf(u1.getClass().getMethod("getId").invoke(u1));
        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }

        if (i1 != -1) {

            i1 = list.size() - i1;

        }

        if (i2 != -1) {

            i2 = list.size() - i2;

        }
        return i2 - i1;
    }));


}

实际业务中如果要维护主客态的话 需要将排序规则和用户主题绑定入库!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值