List去重你真的瞭解嗎
引言
相信大家在開發中都遇到過List去掉重複數據的問題,下面我就問大家總一些方法,可能不是效率特別高的方法,都可以參考下!
單個List去重
- 手動創建一個List對象
List<Integer> list = new ArrayList<>();
list.add(24);
list.add(39);
list.add(5);
list.add(40);
list.add(39);
list.add(25);
list.add(238);
list.add(25);
方法一:使用java8新特性stream進行List去重
List<Integer> newList = (List<Integer>) list.stream().distinct().collect(Collectors.toList());
System.out.println("java8新特性stream去重:" + newList); //distinct()去重的方法
方法二:雙重for循環去重
for (int i = 0; i < list.size(); i++) {
for (int j = 0; j < list.size(); j++) {
if (i != j && list.get(i) == list.get(j)) {
list.remove(list.get(j));
}
}
}
System.out.println("雙重for循環去重:" + list);
方法三:set集合判斷去重,不打亂順序
Set<Integer> set1 = new HashSet<>();
List<Integer> newList1 = new ArrayList<>();
for (Integer integer : list) {
if (set1.add(integer)) {
newList1.add(integer);
}
}
list = newList1;
System.out.println("set集合判斷去重:" + list);
方法四:遍歷後判斷賦給另一個list集合
List<Integer> newList2 = new ArrayList<>();
for (Integer integer : list) {
if (!newList2.contains(integer)) {
newList2.add(integer);
}
}
System.out.println("賦值新list去重:" + newList2);
方法五:set和list轉換去重
Set<Integer> set2 = new HashSet<>();
List<Integer> newList3 = new ArrayList<>();
set2.addAll(list);
newList3.addAll(set2);
System.out.println("set和list轉換去重:" + newList3);
兩個List去重
- 構建兩個List對象
List<String> A = new ArrayList<String>();
A.add("X");
A.add("U");
A.add("E");
A.add("Q");
A.add("I");
List<String>B = new ArrayList<String>();
B.add("Q");
B.add("M");
B.add("I");
B.add("A");
B.add("O");
需求一:取出兩個List對象重複的數據(交集)
List<String> C = new ArrayList<String>();
//C集合中一次性添加全部A集合中的數據
C.addAll(A);
//retainAll爲JAVA中取交集的方法
C.retainAll(B);
System.out.println(C);
需求二:取出在A中所有數據並去掉在B中也存在的數據
List<String> D = new ArrayList<String>();
//D集合中一次性添加全部A集合中的數據
D.addAll(A);
//刪除D集合中B集合中也存在的數據(removeAll從列表中移除指定 collection 中包含的其所有元素)
D.removeAll(B);
System.out.println(D);
兩個List對象去重
- User對象類(注意要生成getter setter hashCode equals方法)
public class User {
//eclipse快捷鍵shift+alt+s自動生成(默認實體類的所有屬性)注意生成getter setter hashCode equals 方法
private String name;
private Integer age;
private String type;
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", type=" + type + "]";
}
public User(String name, String type) {
super();
this.name = name;
this.type = type;
}
}
- 創建兩個User對象
List<User> A = new ArrayList<User>();
User user1 = new User("xue", "2");
A.add(user1);
User user2 = new User("qi", "22");
A.add(user2);
User user3 = new User("miao", "22");
A.add(user3);
List<User> B = new ArrayList<User>();
User user4 = new User("qi", "22");
B.add(user4);
User user5 = new User("miao", "5");
B.add(user5);
場景一:找出重複的User
List<User> distinctList = new ArrayList<User>();
distinctList.addAll(A);
distinctList.retainAll(B);//retainAll爲JAVA中取交集的方法
for (User obj : distinctList) {
System.out.println("姓名:" + obj.getName() + "---" + "類型:" + obj.getType());
}
場景二:去掉重複的User
List<User> distinctList2 = new ArrayList<User>();
distinctList2.addAll(A);
distinctList2.removeAll(B);//removeAll從列表中移除指定 collection 中包含的其所有元素
for (User obj : distinctList2) {
System.out.println("姓名:" + obj.getName() + "---" + "類型:" + obj.getType());
}
場景三:去掉A中類型與B中類型一樣的數據
//循環取出B中的類型作爲Key(一般在真實項目中會封裝工具類)
for (User user : B) {
userMap.put(user.getType(), user);
}
for(User user : A) {
//如果A中的類型在userMap中找不到對應的Key就將User對象加入distinctList3中
if(!userMap.containsKey(user.getType())) {
distinctList3.add(user);
}
}
for(User user : distinctList3) {
System.out.println(user);
}
下期再見。。。