List 集合去重


List 去重指的是将 List 中的重复元素删除掉的过程。

 

List 去重有以下 3 种实现思路:

  1. 自定义方法去重,通过循环判断当前的元素是否存在多个,如果存在多个,则删除此重复项,循环整个集合最终得到的就是一个没有重复元素的 List;
  2. 使用 Set 集合去重,利用 Set 集合自身自带去重功能的特性,实现 List 的去重;
  3. 使用 JDK 8 中 Stream 流的去重功能。

 

初始化定义bean:

//这里的Person使用 lombok 的 @Data , 如果不是使用@Data,需要重写 equals 和 hashCode

import lombok.Data;

@Data
public class Person {
    private String name;
    private String password;
    private int age;

    public Person(String name, String password, int age) {
        this.name = name;
        this.password = password;
        this.age = age;
    }
}

//不使用@Data Person1定义(需要重写 equals 和 hashCode):

public class Person1 {

    private String name;
    private String password;
    private int age;
    
    public Person1(String name, String password, int age) {
        super();
        this.name = name;
        this.password = password;
        this.age = age;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + ((password == null) ? 0 : password.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person1 other = (Person1) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (password == null) {
            if (other.password != null)
                return false;
        } else if (!password.equals(other.password))
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "Person1 [name=" + name + ", password=" + password + ", age=" + age + "]";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
View Code

1. 自定义去重

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class DistinctListBeanByCustz {
    public static void main(String[] args) {
        // 创建并给 List 赋值
        List<Person> list = new ArrayList<>();
        list.add(new Person("李四", "123456", 20));
        list.add(new Person("张三", "123456", 18));
        list.add(new Person("王五", "123456", 22));
        list.add(new Person("张三", "123456", 18));
        
        // 这里的Person使用 lombok 的 @Data
        // 如果不是使用@Data,需要重写 equals 和 hashCode

        // 去重方式1:如果新集合中不存在则插入
        System.out.println(" **********  自定义去重操作方法1  **********  ");
        List<Person> newList = new ArrayList<>(list.size());
        list.forEach(i -> {
            if (!newList.contains(i)) {
                newList.add(i);
            }
        });
        newList.forEach(p -> System.out.println(p));

        // 去重方式2:获取循环的值,如果存在两个相同的值,移除相同的值
        System.out.println(" **********  自定义去重操作方法2  **********  ");
        Iterator<Person> iterator = list.iterator();
        while (iterator.hasNext()) {
            Person item = iterator.next();
            if (list.indexOf(item) != list.lastIndexOf(item)) {
                iterator.remove();
            }
        }
        list.forEach(p -> System.out.println(p));
    }
}

执行结果:

 **********  自定义去重操作方法1  **********  
Person(name=李四, password=123456, age=20)
Person(name=张三, password=123456, age=18)
Person(name=王五, password=123456, age=22)
 **********  自定义去重操作方法2  **********  
Person(name=李四, password=123456, age=20)
Person(name=王五, password=123456, age=22)
Person(name=张三, password=123456, age=18)

 

2. 利用Set集合去重

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;

public class DistinctListBeanBySet {
    public static void main(String[] args) {
        // 创建并给 List 赋值
        List<Person> list = new ArrayList<>();
        list.add(new Person("李四", "123456", 20));
        list.add(new Person("张三", "123456", 18));
        list.add(new Person("王五", "123456", 22));
        list.add(new Person("张三", "123456", 18));
        
        // 去重操作  HashSet 去重元素的先后顺序会发生变化
        System.out.println(" **********  HashSet 去重元素的先后顺序会发生变化  **********  ");
        HashSet<Person> set1 = new HashSet<>(list);
        set1.forEach(p -> System.out.println(p));
        
        // 去重操作  LinkedHashSet 去重元素的先后顺序不会发生变化
        System.out.println(" **********  LinkedHashSet 去重元素的先后顺序不会发生变化  **********  ");
        LinkedHashSet<Person> set2 = new LinkedHashSet<>(list);
        set2.forEach(p -> System.out.println(p));
    }
}

执行结果:

 **********  HashSet 去重元素的先后顺序会发生变化  **********  
Person(name=张三, password=123456, age=18)
Person(name=李四, password=123456, age=20)
Person(name=王五, password=123456, age=22)
 **********  LinkedHashSet 去重元素的先后顺序不会发生变化  **********  
Person(name=李四, password=123456, age=20)
Person(name=张三, password=123456, age=18)
Person(name=王五, password=123456, age=22)

 

3. 利用 Stream 去重

 最简单的一种去重方式,我们可以使用 JDK 8 中提供的 Stream 进行去重,Stream 中包含了一个去重方法:distinct,可以直接实现集合的去重功能,具体实现代码如下:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class DistinctListBeanByStream {
    public static void main(String[] args) {
        // 创建并给 List 赋值
        List<Person> list = new ArrayList<>();
        list.add(new Person("李四", "123456", 20));
        list.add(new Person("张三", "123456", 18));
        list.add(new Person("王五", "123456", 22));
        list.add(new Person("张三", "123456", 18));
        
        // 去重操作
        list = list.stream().distinct().collect(Collectors.toList());
        list.forEach(p -> System.out.println(p));
    }
}

 

4. 总结

本文介绍了 List 集合去重的 3 种实现思路,其中自定义去重功能实现起来相对繁琐;

Set 集合依靠其自带的去重特性,可以很方便的实现去重功能,并且可以使用 LinkedHashSet 在去重的同时又保证了元素所在位置不被更改;

最后一种去重的方法,是 JDK 8 中新增的,使用 Stream 中的 distinct 方法实现去重,它的优点是不但写法简单,而且无需创建新的集合,是实现去重功能的首选方法。

 

 参考自:https://mp.weixin.qq.com/s/9wClveSNDDLi7Ia6FnTYrw

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM