1. 程式人生 > 其它 >List集合資料去重

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;
    }

這種方式在複雜型別時可能會使用。

就是這麼簡單,你學廢了嗎?感覺有用的話,給筆者點個贊吧 !