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

下期再見。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章