业务场景:
页面左右两个datagrid,双击左边datagrid行,移动到右边datagrid,右边datagrid行双击,移动到左边datagrid
点击保存,提交修改的数据到后台
后台要把查询到的数据,和这次提交的数据对比,不变的不动,有新添加的,要增加,有去掉的要执行删除操作
注:不能统一删除,再全新增,原来已经存在的信息可以做了一些配置,全删除,再全插入,原来的配置会丢了。
那就要后台对两个集合进行对比。
为了方便理解,搞点简单数据举个栗子:
已经存在的集合:info : ['A' ,'B' ,'C' ,'D' , 'E', 'F']
本次提交的集合:list : ['A' ,'B' ,'C' ,'D' , 'G', 'H']
//0. list是前台参数传递进来的右边datagrid数据。
List list
//1.根据该业务系统已经导入的表集合,和本次保存的集合,求差集
List info = tbBaseinfoMapper.selectList(new QueryWrapper().eq("project_id", projectId)); //数据库中已存在的数据
//注意:求差集------------A和B,差集,B和A差集,合在一起去重,才是整个差集
//我这里页面传递的对象,页面操作做过修改,对象有的字段被修改了,对象并不完全相等,要用id来判断,是否是同一个对象
List differenceSet1 = info.stream().filter(item -> !list.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());//已有数据和提交数据的差集,得到差集['E', 'F']
List differenceSet2 = list.stream().filter(item -> !info.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());//提交数据和已有数据的差集,得到差集['G', 'H']
List differenceSet = new ArrayList(differenceSet1);
differenceSet.addAll(differenceSet2);//两个差集合并在一起
differenceSet = differenceSet.stream().distinct().collect(Collectors.toList());//合并后的差集去重 [ 'E', 'F' ,'G', 'H' ]
//2.已经存在的集合,和本次提交的集合,求交集
List intersection = info.stream().filter(item -> list.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList()); //得到交集:['A' ,'B' ,'C' ,'D']
//3.本次保存的集合,和交集,的差集
List allDifferenceSet1 = info.stream().filter(item -> !intersection.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['A' ,'B' ,'C' ,'D' , 'G', 'H']和 ['A' ,'B' ,'C' ,'D']的差集,得到差集:['G', 'H']
List allDifferenceSet2 = intersection.stream().filter(item -> !info.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['A' ,'B' ,'C' ,'D']和 ['A' ,'B' ,'C' ,'D' , 'G', 'H']的差集,得到差集:[]
List allDifferenceSet = new ArrayList(allDifferenceSet1);
allDifferenceSet.addAll(allDifferenceSet2); //合并差集为:['G', 'H']
allDifferenceSet = allDifferenceSet.stream().distinct().collect(Collectors.toList()); //去重还是['G', 'H']
List allDifference = allDifferenceSet;
//4.最终的差集,和第一次的差集,的交集,即是要添加的,差集即是要删除的
List addList = differenceSet.stream().filter(item -> !allDifference.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['G', 'H']和[ 'E', 'F' ,'G', 'H' ]的交集:['G', 'H'],即是要添加的,插入
List delList = differenceSet.stream().filter(item -> allDifference.stream().map(e -> e.getId()).collect(Collectors.toList()).contains(item.getId())).collect(Collectors.toList());
//['G', 'H']和[ 'E', 'F' ,'G', 'H' ]的差集:['E', 'F'],即是要删除的
//5.删除
delList.forEach(item->{
String id = item.getId();
String tableName = item.getTable_name();
tbBaseinfoMapper.deleteById(id);
String sql="DROP TABLE IF EXISTS "+tableName;
jdbcUtil.executeSql(sql);
});
//6.插入
for(TbBaseinfo obj:addList) {
tbBaseinfoMapper.insert(obj);
}
}
C# 集合的交集 差集 并集 去重
C# 集合的交集 差集 并集 去重 两个对象list,直接比较是不行的,因为他们存的地址不一样 需要重写GetHashCode()与Equals(object obj)方法告诉电脑 class Stu ...
python-->;(set /dict)交集 差集 并集 补集(功能用来做交差并补的)
# ### 集合 作用:交集 差集 并集 补集(功能用来做交差并补的) '''特征:自动去重 无序''' #定义一个空集合 setvar = set() #set()强制转换成一个空集合的数据类型 p ...
js取两个数组的交集|差集|并集|补集|去重示例代码
http://www.jb51.net/article/40385.htm 代码如下: /** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一 ...
python两个 list 交集,并集,差集的方法+两个tuple比较操作+两个set的交集,并集,差集操作+两个dict的比较操作
转自:http://blog.chinaunix.net/uid-200142-id-3992553.html 有时候,为了需求,需要统计两个 list 之间的交集,并集,差集.查询了一些资料,现在总 ...
java 交集 差集 并集
package com.wish.datastrustudy; import java.util.HashSet; import java.util.LinkedList; import java.u ...
C# 数组比较--取得两个集合的交集,差集,并集的方法
方法关键字: 交集:Intersect 差集:Except 并集:Union 使用代码: , , , , }; , , , , }; var 交集 = arr1.Intersect(arr2).ToL ...
[转]list的交集,差集,并集