栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

List 集合去重合并 , 多种方法演示

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

List 集合去重合并 , 多种方法演示

List a = new ArrayList();
a.add("2");
a.add("4");
a.add("5");
a.add("6");
List b = new ArrayList();
b.add("2");
b.add("3");
b.add("6");
b.add("7");

1.集合自带的api

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

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

3.Map 方式 , key 是唯一的

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

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

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


关于两个List集合对象去重

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

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

二:removeAll()

			List A = new ArrayList();
			A.add("A");
			A.add("B");
			A.add("C");
			A.add("D");
			
			ListB = new ArrayList();
			B.add("C");
			B.add("D");
			B.add("E");
			B.add("F");
			
			List C = new ArrayList();
			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 A = new ArrayList();
		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 B = new ArrayList();
		User user4 = new User("LiMing", "1");
		B.add(user4);
 
		User user5 = new User("WangHong", "2");
		B.add(user5);
 
		List distinctList = new ArrayList();
		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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/679197.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号