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