對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; }
這種方式在復雜類型時可能會使用。