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

下期再见。。。

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