首先我们有两个集合A,B,我们以其中一个集合A为基准
想获得B集合中的元素,相对于A集合来说,哪些元素不存在,哪些元素A没有
业务场景:以db1中的数据为准,更新db2中的数据,db1有的,db2没有的进行添加操作,db2有的,db1没有的进行删除操作
那么我们就需要知道,哪些元素是要添加的,哪些是要删除的
传统做法:通过标记实现
private static Map<String, List<String>> getContrast(List<String> newTypeList, List<String> oldTypeList){
Map<String,Integer> map = new HashMap<>();
Map<String,List<String>> resultMap = new HashMap<>();
//被删除的集合
List<String> deleteList = new ArrayList<>();
//添加的集合
List<String> addList = new ArrayList<>();
//遍历标记新的集合元素为1
for (String nItem : newTypeList) {
map.put(nItem,1);
//遍历标记相同的集合元素为2
for (String oItem : oldTypeList) {
Integer tag = map.get(oItem);
if (tag != null) {
map.put(oItem,2);
continue;
//标记 旧集合元素为3
map.put(oItem,3);
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if (entry.getValue().equals(1)) {
addList.add(entry.getKey());
resultMap.put("addList",addList);
if (entry.getValue().equals(3)) {
deleteList.add(entry.getKey());
resultMap.put("delList",deleteList);
return resultMap;
public static void main(String[] args) {
List<String> newList = new ArrayList<>();
newList.add("apple");
newList.add("banana");
newList.add("pina");
List<String> oldList = new ArrayList<>();
oldList.add("apple");
oldList.add("mikl");
Map<String, List<String>> contrast = getContrast(newList, oldList);
for (Map.Entry<String, List<String>> stringListEntry : contrast.entrySet()) {
System.out.println(stringListEntry.getKey() + "-" + stringListEntry.getValue());
测试结果:我们可以看到相对新的集合来说,老的集合没有“banana”和“pina”,而老的集合有的“milk”新的集合则没有,结果正确
JAVA8做法:通过流实现
public static void main(String[]args){
List<String> list1 = new ArrayList<String>();
list1.add("apple");
list1.add("banana");
list1.add("pina");
List<String> list2 = new ArrayList<String>();
list2.add("apple");
list2.add("mikl");
List<String> collect1 = list1.stream().filter(num -> list2.contains(num))
.collect(Collectors.toList());
System.out.println("交集: " + collect1);
// collect1.stream().forEach(System.out::println);
//差集 list1-list2
List<String> collect2 = list1.stream().filter(num -> !list2.contains(num))
.collect(Collectors.toList());
System.out.println("addList 即差集list1-list2: " + collect2);
// collect2.stream().forEach(System.out::println);
//差集list2-list1
List<String> collect3 = list2.stream().filter(num -> !list1.contains(num))
.collect(Collectors.toList());
System.out.println("delList 即差集list2-list1: " + collect3);
// collect3.stream().forEach(System.out::println);
//并集 不去重
list1.addAll(list2);
System.out.println("并集 不去重: " + list1);
// list1.stream().forEach(System.out::println);
//并集 去重
List<String> collect4 = list1.stream().distinct().collect(Collectors.toList());
System.out.println("并集 去重: " + collect4);
// collect4.stream().forEach(System.out::println);
效果是一样的,但是代码量少了很多
Java 查找两个集合中的相同元素和不同元素
假设有这个集合, List<Category> metaCategs , 只要categId 在下面数组中,就从metaCategs中移除
Integer[] removeCategIds =ne...
如上图所示,Stream中的操作可以分为两大类:中间操作与结束操作。
中间操作只是对操作进行了记录,只有结束操作才会触发实际的计算(即惰性求值),这也是Stream在迭代大集合时高效的原因之一。中间操作又可以分为无状态(Stateless)操作与...
在Java编程中,如何比较集合中的元素?以下示例通过使用Collection类的Collection.min()和Collection.max()方法将字符串转换为树形集合来比较集合中的元素。package com.yiibai;import java.util.Collections;import java.util.Set;import java.util.TreeSet;public cla...
优点:时间复杂度为O(n)级别;缺点:只适用于Int,以及Int的数字不能过大,集合元素数量不能过多。理论分析:两个集合的元素之和以及之积相同则,这两个集合相等。(前提是两个集合的数量一致)证明: 先证明集合只有两个元素的情况A={a,b} B={x,y}a+b=x+y,a*b=x*y 联立之后可以得出2组解a=x,b=y;a=y,b=x;说明2个集合相等。更多的元素的集合。我们只需要假设k元素的...
中间操作:中间操作都是filter()、distinct()、sorted()、map()、flatMap()等,其一般是对数据集的整理(过滤、排序、匹配、抽取等),将一个stream转换成另一个stream。
终止方法:往往是完成对数据集中数据的处理,如forEach(),还有allMatch()、anyMatch()、findAny()、 findFirst(),数值计算类的方法有sum、m...
今天开发一个需求时,要对A和B两个List集合遍历,并比较出集合A有,而集合B没有的值。
比如说List集合A有’one’,‘two’,‘three’三个值,List集合B有’one’,‘three’两个值。
那么最终打印’two’。
下面我就用stream流来做个例子。
例子中,集合A的泛型为HashMap,集合B的泛型为String。
Stream流中,forEach()方法用于对一个流进行结尾动作,同时对最终过滤后的元素结果进行一个遍历操作。
我们可以在forEach()中直接写入类和其对应方法名,来
if (levelNames.size() > 1) {
for (int i = 0; i < levelNames.size(); i++) {
for (int j = levelNames.size() - 1; j > i; j--) {
List<List<Long>> lists = new ArrayList<>();
List<Long> o1 = (.
如题:有List list1和List list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素?方法1:遍历两个集合:packagecom.czp.test;importjava.util.ArrayList;importjava.util.List;public classTestList {public static voidmain(String[] args) {List lis...