List 集合去重合并 , 多种方法演示___关于两个List集合对象去重

x33g5p2x  于2021-12-24 转载在 其他  
字(3.6k)|赞(0)|评价(0)|浏览(471)
List<String> a = new ArrayList<String>();
a.add("2");
a.add("4");
a.add("5");
a.add("6");
List<String> b = new ArrayList<String>();
b.add("2");
b.add("3");
b.add("6");
b.add("7");

1.集合自带的api

这种方式看似挺方便 , 但是其底层还是遍历的去重 , 如果数据量太大还是不建议使用

public static void sortListTwo(List<String> a, List<String> b) {
		System.out.println("removeAll***************************");
		a.removeAll(b);
		a.addAll(b);
		for (String str2 : a) {
			System.out.println(str2);
		}
}

2.Set 方式 , 其本身就是不重复的集合

public static void sortListOne(List<String> a, List<String> b) {
	    System.out.println("HashSet****************");
		Set<String> set = new HashSet<String>();
		set.addAll(a);
		set.addAll(b);
		List<String> c = new ArrayList<String>(set);
		for (String str : c) {
			System.out.println(str);
		}
	}

3.Map 方式 , key 是唯一的

这种方式可以去重 ,但是需要遍历两个list , 还是较为繁琐

public static void sortListFree(List<String> a, List<String> b) {
		System.out.println("Map***************************");
		Map<String, Object> map = new HashMap<String, Object>();
		for (String str : a) {
			map.put(str, str);
		}
		for (String str1 : b) {
			map.put(str1, str1);
		}
		for(Map.Entry<String , Object> entry : map.entrySet()){
			System.out.println(entry.getKey()+":"+entry.getValue());
		}
	}

注意:以上的几种方式都是针对的基本数据类型 , 如果是对象的话会有一些问题

关于两个List集合对象去重

在说到两个对象去重之前,首先我们回顾下普通类型的list如何去重,这里先说两个list自带的方法,图画的不是太好。
一:retainAll()

List<String> A = new ArrayList<String>();
			A.add("A");
			A.add("B");
			A.add("C");
			A.add("D");
			
			List<String>B = new ArrayList<String>();
			B.add("C");
			B.add("D");
			B.add("E");
			B.add("F");
			List<String> C = new ArrayList<String>();
			C.addAll(A);
			C.retainAll(B);
			System.out.println(C); 
结果: [C, D]

二:removeAll()

List<String> A = new ArrayList<String>();
			A.add("A");
			A.add("B");
			A.add("C");
			A.add("D");
			
			List<String>B = new ArrayList<String>();
			B.add("C");
			B.add("D");
			B.add("E");
			B.add("F");
			
			List<String> C = new ArrayList<String>();
			C.addAll(A);
			C.removeAll(B);
			System.out.println(C);
结果:[A, B]

上面的方法看完相信已经知道一大半了,其实要做到对象去重很简单,就是还要在你的entity里重写equals和hashCode方法,

不知道为什么的同学可以参照这篇文章,讲的还不错:java为什么要重写hashCode和equals方法
点击打开链接 有时候,根据业务不同,可以把需要去重的条件加进去即可。举一个好吃的栗子,代码如下

entity:

public class User {
	
	private String name;
	private Integer age;
	private String type;
// Setters and Getters 省略get&set方法.
//方便测试,写出有参构造,默认时无参.
	public User(String name,String type,int age){
		this.name = name;
		this.type  = type;
	}
	//eclipse快捷键shift+alt+s自动生成(默认实体类的所有属性)。 下边的重写方法只是根据姓名和类型来判断去重,业务不同写法不同
	@Override
	public int hashCode() {
		String result = name+type;
		return result.hashCode();
	}
	@Override
	public boolean equals(Object obj) {
		User u = (User)obj;
		return this.getName().equals(u.getName()) && (this.getType().equals(u.getType()));
	}
}

test:

public class UserDistinctTest {
	public static void main(String[] args) {
		List<User> A = new ArrayList<User>();
		User user1 = new User("LiMing", "1");
		A.add(user1);
 
		User user2 = new User("WangHong", "2");
		A.add(user2);
 
		User user3 = new User("ZhangLiang", "3");
		A.add(user3);
 
		List<User> B = new ArrayList<User>();
		User user4 = new User("LiMing", "1");
		B.add(user4);
 
		User user5 = new User("WangHong", "2");
		B.add(user5);
 
		List<User> distinctList = new ArrayList<User>();
		distinctList.addAll(A);
		distinctList.retainAll(B);
       //distinctList.removeAll(B); 结果: 姓名:ZhangLiang---类型:3
       for (User obj : distinctList) {
         System.out.println("姓名:" + obj.getName() + "---" + "类型:"+ obj.getType());
    }
   }
}
结果:姓名:LiMing---类型:1 姓名:WangHong---类型:2

相关文章