JAVA——两个List集合求交集、并集和差集(去重)模板
关注微信公众号:CodingTechWork,一起学习进步。
引言
经常遇到一些集合类之间的过滤数据、求合集之类的问题,在此以List为例,毕竟在数据库中取数据后,我们使用比较多的是List集合进行操作。
模板
代码
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.add("i");
stringList.add("j");
stringList.add("a");
//一、求交集
//方法1:直接通过retainAll直接过滤
List<String> stringList1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList1.retainAll(stringList);
System.out.println("交集1: " + stringList1);
//方法2:通过过滤掉存在于stringList的数据
List<String> stringList1_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> strings = stringList1_2.stream()
.filter(item -> stringList.contains(item))
.collect(toList());
System.out.println("交集2:" + strings);
//二、并集
//有重并集
List<String> stringList2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList2.addAll(stringList);
System.out.println("并集: " + stringList2);
//无重并集
List<String> stringList2_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> stringList_1 = new ArrayList<>(Arrays.asList("a,b,c,i,j,a".split(",")));
stringList2_2.removeAll(stringList_1);
stringList_1.addAll(stringList2_2);
System.out.println("无重并集: " + stringList_1);
//三、求差集
//方法1:直接使用removeAll()方法
List<String> stringList3 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList3.removeAll(stringList);
System.out.println("差集1: " + stringList3);
//方法2:通过过滤掉不存在于stringList的数据,然后和本数组进行交集处理
List<String> stringList3_2 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
stringList3_2.retainAll(stringList3_2.stream()
.filter(item -> !stringList.contains(item))
.collect(toList()));
System.out.println("差集2:" + stringList3_2);
SpringApplication.run(DemoApplication.class, args);
}
结果
交集1: [a, b, c]
交集2:[a, b, c]
并集: [a, b, c, d, e, f, g, h, a, b, c, i, j, a]
无重并集: [a, b, c, i, j, a, d, e, f, g, h]
差集1: [d, e, f, g, h]
差集2:[d, e, f, g, h]
注意list赋值问题
如果使用了赋值方式,如list1 = list0
,然后list1.retainAll(list2)
或者list1.removeAll(list2)
其实list0的值也变化了。因为lis1和list0指向了同一个地址。
代码:
List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> s2 = s1;
System.out.println("s1地址和s2是否相等(是否为同一个对象): " + (s1 == s2));
s2.remove("g");
s2.remove("h");
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
结果:
s1地址和s2是否相等(是否为同一个对象): true
s1: [a, b, c, d, e, f]
s2: [a, b, c, d, e, f]
所以我们需要使用 List<String> list1= new ArrayList<>(list0);
的方式
代码:
List<String> s1 = new ArrayList<>(Arrays.asList("a,b,c,d,e,f,g,h".split(",")));
List<String> s2 = new ArrayList<>(s1);
System.out.println("s1地址和s2是否相等(是否为同一个对象): " + (s1 == s2));
s2.remove("g");
s2.remove("h");
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
结果:
s1地址和s2是否相等(是否为同一个对象): false
s1: [a, b, c, d, e, f, g, h]
s2: [a, b, c, d, e, f]
同时,我们1在使用removeAll()
方法时,有时候会遇到报错或者失效的情形,比如List中是一个一个对象类,且没有重写过equals和hashCode方法,就会带来这种不相等的情况,从而导致失效,这个问题也要注意一下。
烧不死的鸟就是凤凰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)