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

原文地址:https://www.cnblogs.com/myseries/p/10815309.html