zoukankan      html  css  js  c++  java
  • JAVA 自定义对象集合 List<T> 根据自定义字段去重

    1、拥有自定义对象 MyUser

    1    @Data
    2    public class MyUser {
    3         private String userName;
    4         private String passWord;
    5     }

    2、编写自定义去重方法实现

    /**
         * 根据list中对象某些字段去重
         * @param list 需要去重的list
         * @return 返回去重后的list
         */
        private static List<MyUser> removeDuplicateOutputField(List<MyUser> list) {
            Set<MyUser> set = new TreeSet<>(new Comparator<MyUser>() {
                @Override
                public int compare(MyUser myUser, MyUser myUserNew) {
                    int compareToResult = 1;//==0表示重复
                    if(StringUtils.equals(myUser.getUserName(), myUserNew.getUserName()) &&
                            StringUtils.equals(myUser.getPassWord(), myUserNew.getPassWord())) {
                        compareToResult = 0;
                    }
                    return compareToResult;
                }
            });
            set.addAll(list);
            return new ArrayList<>(set);
        }

    注意:其中StringUtils.equals()   传入两个比较对象对应的字段,

    比如想要加入userName 字段去重  就要加入  如下条件即可,  想要添加几个字段自行添加即可

    StringUtils.equals(myUser.getUserName(), myUserNew.getUserName())  也可以  使用
    myUser.getAge().equals(myUserNew.getAge())  自行测试决定

    3、测试结果

        @Test
        public void distinctMyUser(){
            List<MyUser> list1 = new ArrayList<>();
            MyUser user1 = new MyUser();
            user1.setUserName("zhangsan");
            user1.setPassWord("1234567");
            list1.add(user1);
    
            MyUser user2 = new MyUser();
            user2.setUserName("zhangsan");
            user2.setPassWord("123456");
            list1.add(user2);
    
            MyUser user3 = new MyUser();
            user3.setUserName("lisi");
            user3.setPassWord("123456");
            list1.add(user3);
    
            MyUser user4 = new MyUser();
            user4.setUserName("lisi");
            user4.setPassWord("123456");
            list1.add(user4);
    
            for (MyUser b: list1) {
                System.out.println("去重前:"+b.toString());
            }
    
            //去重
            list1 = removeDuplicateOutputField(list1);
    
            for (MyUser b: list1) {
                System.out.println("去重后:"+b.toString());
            }
        }

    运行结果如下,达到预期,根据自己想要的字段进行list集合去重操作。

     二、List<T> 自定义对象,根据某一列去重,利用lambad 来实现

         @Test
        public void distinctList() {
            AdviceInfo adviceInfo = new AdviceInfo();
            adviceInfo.setHospId(8888L);
            adviceInfo.setSex("女");
            adviceInfo.setAge(22);
    
            AdviceInfo adviceInfo2 = new AdviceInfo();
            adviceInfo2.setHospId(8888L);
            adviceInfo2.setSex("男");
            adviceInfo2.setAge(22);
    
            ArrayList<AdviceInfo> adviceInfos = Lists.newArrayList();
            adviceInfos.add(adviceInfo);
            adviceInfos.add(adviceInfo2);
    
            adviceInfos.stream().filter(distinctByKey(e -> e.getHospId()))
                    .collect(Collectors.toList())
                    .forEach(adviceInfo1 -> System.out.println(adviceInfo1.getSex()));
    
        }
    
        public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
            Map<Object, Boolean> map = new ConcurrentHashMap<>();
            return t -> map.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
        }

    运行结果:

  • 相关阅读:
    Windows 7 远程协助
    Windows 7 帮助和支持资源—第三方网站
    Windows 7 帮助和支持资源—第三方软件
    数据结构-队列
    数据结构-栈
    pycharm每日技巧-2
    数据结构-链表
    时间处理-1
    二维数组的排序
    《疯狂的简洁》书摘
  • 原文地址:https://www.cnblogs.com/yinfengjiujian/p/11738641.html
Copyright © 2011-2022 走看看