Java 获取两个List的交集和差集,以及应用场景

背景介绍
在实际项目中,特别是一些管理后台类的项目,会遇到底层数据是按照一对多关系的数据表存储的管理界面。列表页是一对多关系中一对应的数据列表,二级的详情页中是一对多关系中多对应的多条数据展示。通常二级页面是能够增、删、改数据的编辑页面,在点击保存提交数据后,服务器端需要插入新增的数据,删除要删除的数据,更新改变的数据

交集:指的是两个List对象中都有的元素。 
差集:指的是一个List对象中有,而另一个List对象中没有的元素。

转化为一般问题

页面保存数据详情按钮后,请求会传送一组数据到服务端,服务端把这组数据保存到一个List对象中。如果客户端传送的数据有的省份行情数据,数据库中也有该省的行情数据,则这些数据是要更新的数据。如果数据库中有的省份数据,而客户端传送的数据中没有该省份数据,则这些数据是要删除的。
经过上述分析,不难发现就是找出两个List对象的交集和差集。例如,a为客户端传送的数据List对象,b为从数据库中获取的List对象。 a中有的元素,而b中没有的元素就是要插入数据库中的数据,即a与b的差集。a和b共有的元素就是要更新的数据,即a与b的交集。b中有的元素,a中没有的就是要删除的数据,即b与a的差集。

程序代码
程序的大致思路是:利用LinkedHashMap key值的唯一性和顺序存储的特性,把detailFlow作为key值,先用一个map添加一个List元素,然后再去比较另一个List对象中的元素,找出detailFlow相同的对象和只有b中才有的对象。map中去除相同的key值的对象,剩余的就是a中独有的元素。

实体类 略…

求两个List 交集 差集

private int sameAndDifferentOperation(String projectFlow, List<SkillPdDetail> pdDetailListOld, List<SkillPdDetail> pdDetailListNew) {
		LinkedHashMap<String, SkillPdDetail> map = new LinkedHashMap<>();
		LinkedHashMap<String, SkillPdDetail> sameMap = new LinkedHashMap<>();
		LinkedHashMap<String, SkillPdDetail> onlyBMap = new LinkedHashMap<>();
		LinkedList<SkillPdDetail> sameItems = new LinkedList<>();
		LinkedList<SkillPdDetail> onlyAItems = new LinkedList<>();
		LinkedList<SkillPdDetail> onlyBItems = new LinkedList<>();
		//把oldList.detailFlow 做为key存到map中
		for (SkillPdDetail item : pdDetailListOld) {
			map.put(item.getDetailFlow(), item);
		}
		for (SkillPdDetail item : pdDetailListNew) {
		    //遍历newList,key值相同时,则添加到sameMap中,不同时则添加到onlyBMap中
			if (map.containsKey(item.getDetailFlow())) {
				SkillPdDetail pdDetail = map.get(item.getDetailFlow());
				sameMap.put(item.getDetailFlow(), pdDetail);
			} else {
			    //考虑多个key值为null时,数据覆盖,及时添加到list中
				onlyBMap.put(item.getDetailFlow(), item);
				onlyBItems.addAll(onlyBMap.values());
			}
		}
		sameItems.addAll(sameMap.values());
		for (SkillPdDetail item : sameItems) {
			map.remove(item.getDetailFlow());
		}
		onlyAItems.addAll(map.values());
		try {
		    //只有数据库中存在的数据删除 
			if (onlyAItems.size() > 0 && onlyAItems != null) {
				for (SkillPdDetail onlyAItem : onlyAItems) {
					onlyAItem.setRecordStatus(GlobalConstant.RECORD_STATUS_N);
					this.addProjectDetail(onlyAItem);
				}
			}
			//新增加的数据插入数据库
			if (onlyBItems.size() > 0 && onlyBItems != null) {
				for (SkillPdDetail onlyBItem : onlyBItems) {
					onlyBItem.setProjectFlow(projectFlow);
					this.addProjectDetail(onlyBItem);
				}
			}
			//相同的数据则更新
			if (sameItems.size() > 0 && sameItems != null) {
				for (SkillPdDetail sameItem : sameItems) {
					this.addProjectDetail(sameItem);
				}
			}
		} catch (Exception e) {
			return 0;
		}
		return 1;
	}

新手上路,请多指教
感谢原文转载:https://blog.csdn.net/u010657094/article/details/78906641

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值