1. 程式人生 > 其它 >List<Bean> 集合去重

List<Bean> 集合去重

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