zoukankan      html  css  js  c++  java
  • List集合数据去重

    对list数据去重的方法有如下几种,先以String类型的集合进行说明,对象的元素比较麻烦:

    定义的集合如下:

    List<String> list = new ArrayList<>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("5");
    list.add("3");
    list.add("2");
    list.add("4");

    1.借助Set的特性进行去重

    set集合中的元素是不可重复的。不会保持原来的顺序

        public static List<String> distinctList(List<String> list) {
            List<String> newList = new ArrayList();
            if (null != list && list.size() > 0) {
                Set set = new HashSet();
                set.addAll(list);
                newList.addAll(set);
            }
            return newList;
        }

    这种情况不会保持原来顺序,原因是set是无序的。

    2.利用set集合特性保持顺序一致去重

    2.1String去重

    在创建list集合时传入LinkedhashSet,会保持原来的顺序

        public static List<String> distinctList(List<String> list) {
            List<String> newList = new ArrayList();
            if (null != list && list.size() > 0) {
                newList = new ArrayList<>(new LinkedHashSet<>(list));
            }
            return newList;
        }

    2.2对象去重 

    当然可使用这种方式对元素是对象的集合进行去重:

        public static void main(String[] args) {
            List<User> list = new ArrayList<>();
            list.add(new User(1, "admin", "15623635555"));
            list.add(new User(2, "zhailiu", "15623635555"));
            list.add(new User(3, "lisi", "15623635566"));
            list.add(new User(1, "admin", "15623635775"));
            list.add(new User(3, "zhangsan", "15623621455"));
            list.add(new User(1, "zhangsan", "15623635555"));
            list = new ArrayList<>(new LinkedHashSet<>(list));
       }

    其中User对象如下:

    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    import java.util.Objects;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
        private Integer id;
        private String name;
        private String phone;
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            User user = (User) o;
            return Objects.equals(id, user.id) && Objects.equals(phone, user.phone);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(id, phone);
        }
    }

    需要注意的是,使用这种方式,必须重写equals与hashCode方法。在里面指定需要去重的属性,可以是一个,也可以是多个。这里是以id和phone进行去重。

    3.使用Java8特性去重

    3.1String去重

    使用java8集合的新特性stream的distinct()方法。可保持原来的顺序

        public static List<String> distinctList(List<String> list) {
            List<String> newList = new ArrayList();
            if (null != list && list.size() > 0) {
                newList = list.stream().distinct().collect(Collectors.toList());
            }
            return newList;
        }

    3.2String去重

    当然对于对象的去重也可以使用这种方式:(也需要重写equals和hashCode方法)

        public static void main(String[] args) {
            List<User> list = new ArrayList<>();
            list.add(new User(1, "admin", "15623635555"));
            list.add(new User(2, "zhailiu", "15623635555"));
            list.add(new User(3, "lisi", "15623635566"));
            list.add(new User(1, "admin", "15623635775"));
            list.add(new User(3, "zhangsan", "15623621455"));
            list.add(new User(1, "zhangsan", "15623635555"));
            list = list.stream().distinct().collect(Collectors.toList());
        }

    前提是重写对象的equals与hashCode方法。

    4.遍历集合进行判断

    4.1String去重

    遍历后判断是否包含,而赋给另一个list集合。可保持原来的顺序

        public static List<String> distinctList(List<String> list) {
            List<String> newList = new ArrayList();
            if (null != list && list.size() > 0) {
                for (String str : list) {
                    if (!newList.contains(str)) {
                        newList.add(str);
                    }
                }
            }
            return newList;
        }

     这种方式在复杂类型时可能会使用。

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    你会卖掉自己的网上信息吗?大数据可能根本不属于你
    机器学习——TensorFLow实战房价预测
    数据库运作实践三三之歌(秘制口诀)
    1000行MySQL学习笔记,收藏版!
    吐血整理深度学习入门路线及导航【教学视频+大神博客+书籍整理】+【资源页】(2019年已经最后一个月了,你还不学深度学习吗???)
    Ubuntu Snap 简述
    参数传递
  • 原文地址:https://www.cnblogs.com/zys2019/p/15541444.html
Copyright © 2011-2022 走看看