栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

User对象:

 
    private String uid;

    
    private String userName;

实现:

public static void setOrderByList(List orderRule, List 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 orderRule, List 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 userList = new ArrayList<>();
userList.add(build);
userList.add(build1);
userList.add(build2);
userList.add(build3);
System.out.println("自由排序前:");
System.out.println(userList);


List 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  void setOrderByList(List orderRule, List 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;
    }));


}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/995932.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号