List集合數據去重


對list數據去重的方法有如下幾種,先以String類型的集合進行說明,對象的元素比較麻煩:

定義的集合如下:

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("5");
list.add("3");
list.add("2");
list.add("4");

1.借助Set的特性進行去重

set集合中的元素是不可重復的。不會保持原來的順序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            Set set = new HashSet();
            set.addAll(list);
            newList.addAll(set);
        }
        return newList;
    }

這種情況不會保持原來順序,原因是set是無序的。

2.利用set集合特性保持順序一致去重

在創建list集合時傳入LinkedhashSet,會保持原來的順序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            newList = new ArrayList<>(new LinkedHashSet<>(list));
        }
        return newList;
    }

 當然可使用這種方式對元素是對象的集合進行去重:

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User(1,"admin"));
        list.add(new User(2,"zhailiu"));
        list.add(new User(3,"lisi"));
        list.add(new User(1,"admin"));
        list.add(new User(3,"zhangsan"));
        list.add(new User(1,"admin"));
        list = new ArrayList<>(new LinkedHashSet<>(list));
    }

其中User對象如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String name;
}

需要注意的是,使用這種方式,必須重寫equals與hashCode方法。(可借助lombok插件來重寫)

3.使用Java8特性去重

使用java8集合的新特性stream的distinct()方法。可保持原來的順序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            newList = list.stream().distinct().collect(Collectors.toList());
        }
        return newList;
    }

 當然對於對象的去重也可以使用這種方式:

    public static void main(String[] args) {
        List<User> list = new ArrayList<>();
        list.add(new User(1,"admin"));
        list.add(new User(2,"zhailiu"));
        list.add(new User(3,"lisi"));
        list.add(new User(1,"admin"));
        list.add(new User(3,"zhangsan"));
        list.add(new User(1,"admin"));
        list = list.stream().distinct().collect(Collectors.toList());
    }

前提是重寫對象的equals與hashCode方法。

4.遍歷集合進行判斷

遍歷后判斷是否包含,而賦給另一個list集合。可保持原來的順序

    public static List<String> distinctList(List<String> list) {
        List<String> newList = new ArrayList();
        if (null != list && list.size() > 0) {
            for (String str : list) {
                if (!newList.contains(str)) {
                    newList.add(str);
                }
            }
        }
        return newList;
    }

 這種方式在復雜類型時可能會使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM