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;
        }

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

  • 相关阅读:
    C语言实现mq收发数据的函数
    4G通信模块在ARM平台下的应用
    4G 通信模块在ARM 平台下的应用
    修改web前端访问端口
    从零开始用 Flask 搭建一个网站(一)
    Python实现Windows定时关机
    前端和后端的数据交互(jquery ajax+python flask+mysql)
    python开源项目及示例代码
    Django读取Mysql数据并显示在前端
    C++关于string的一些用法
  • 原文地址:https://www.cnblogs.com/zys2019/p/15541444.html
Copyright © 2011-2022 走看看