zoukankan      html  css  js  c++  java
  • List集合去重的一些方法(常规遍历、Set去重、java8 stream去重、重写equals和hashCode方法)

    public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("a");
            list.add("b");
            list.add("a");
            list.add("c");
            list.add("d");
            list.add("e");
            Deduplication1(list);
            System.out.println("---------");
            Deduplication2(list);
            System.out.println("---------");
            Deduplication3(list);
            System.out.println("---------");
            
        }
        
        // 遍历后判断赋给另一个list集合,保持原来顺序
        public static void Deduplication1(List<String> list) {
            System.out.println("list = " + list );
            List<String> newList = new ArrayList<String>();
            for(String str : list) {
                if(!newList.contains(str)) {
                    newList.add(str);
                }
            }
            System.out.println("newList = " + newList);
        }
        
        // set集合去重,保持原来顺序
        public static void Deduplication2(List<String> list) {
            System.out.println("list = " + list );
            List<String> newList = new ArrayList<String>();
            Set set = new HashSet();
            for(String str : list) {
                if(set.add(str)) {
                    newList.add(str);
                }
            }
            System.out.println("newList = " + newList);
        }
        
        // Set去重     由于Set的无序性,不会保持原来顺序
        public static void Deduplication3(List<String> list) {
            System.out.println("list = " + list );
            Set set = new HashSet();
            List<String> newList = new ArrayList<String>();
            set.addAll(list);
            newList.addAll(set);
            System.out.println("newList = " + newList);
        }

    console结果:

    list = [a, b, a, c, d, e]
    newList = [a, b, c, d, e]
    ---------
    list = [a, b, a, c, d, e]
    newList = [a, b, c, d, e]
    ---------
    list = [a, b, a, c, d, e]
    newList = [d, e, b, c, a]
    ---------

    上面的方法在List元素为基本数据类型及String类型时是可以的,但是如果List集合元素为对象,却不会奏效

    class User {
        private String name;
        private int age;
        
        public User() {
        }
        
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        
        public void setAge(int age) {
            this.age = age;
        }
        
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + "]";
        }
        
    }
    public static void main(String[] args) {
            List<User> userList = new ArrayList<User>();
            userList.add(new User("小黄",10));
            userList.add(new User("小红",23));
            userList.add(new User("小黄",78));
            userList.add(new User("小黄",10));
            
            //使用HashSet,无序
            Set<User> userSet = new HashSet<User>();
            userSet.addAll(userList);
            System.out.println(userSet);
            
            //使用LinkedHashSet,有序
            List<User> listNew = new ArrayList<User>(new LinkedHashSet(userList));
            System.out.println(listNew.toString());
            
        }

    console结果:

    [User [name=小红, age=23], User [name=小黄, age=10], User [name=小黄, age=78], User [name=小黄, age=10]]
    [User [name=小黄, age=10], User [name=小红, age=23], User [name=小黄, age=78], User [name=小黄, age=10]]

    解决方法:对象中重写equals()方法和hashCode()方法

    class User {
        private String name;
        private int age;
        
        public User() {
        }
        
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public int getAge() {
            return age;
        }
        
        public void setAge(int age) {
            this.age = age;
        }
        
        @Override
        public String toString() {
            return "User [name=" + name + ", age=" + age + "]";
        }
        
        @Override
        public boolean equals(Object obj) {
            User user = (User)obj;
            return this.name.equals(user.getName()) && (this.age == user.getAge());
        }
        
        @Override
        public int hashCode() {
            String str = this.name + this.age;
            return str.hashCode();
        }
    }

    console结果:

    [User [name=小红, age=23], User [name=小黄, age=78], User [name=小黄, age=10]]
    [User [name=小黄, age=10], User [name=小红, age=23], User [name=小黄, age=78]]

    采用java8的stream来实现去重

    对于不是对象的list去重:

    //利用java8的stream去重
      List uniqueList = list.stream().distinct().collect(Collectors.toList());
      System.out.println(uniqueList.toString());

    如果List集合元素为对象:

    //根据name属性去重
            List<User> unique1 = userList.stream().collect(
                    collectingAndThen(
                            toCollection(() -> new TreeSet<>(comparing(User::getName))), ArrayList::new));
    
            System.out.println(unique1.toString());
    
            //根据name,age属性去重
            List<User> unique2 = userList.stream().collect(
                    collectingAndThen(
                            toCollection(() -> new TreeSet<>(comparing(o -> o.getName() + ";" + o.getAge()))), ArrayList::new)
            );
    
            System.out.println(unique2.toString());

    转自:https://www.cnblogs.com/zjfjava/p/9897650.html

  • 相关阅读:
    css--盒子模型
    目标爬取社会信用码
    KFC-位置分页爬虫
    百度翻译-爬虫
    网页采集器-UA伪装
    python模块2
    python模块
    go入门
    python垃圾回收机制
    Python高级用法
  • 原文地址:https://www.cnblogs.com/myseries/p/10815309.html
Copyright © 2011-2022 走看看