java数组的交集和并集
数组的并集
求数组的并集时,我们可以通过Set集合的去重机制(Set集合特性无序,不可重复,例如:当已经添加进集合一个数6,再次添加一个数字6,集合是不会成功添加进去的)
思路:我们仅需要定义一个set集合,然后遍历两个数组,同时添加进集合中,再返回集合就获得了两个数组的交集。
如下所示
Set<Integer> set = new HashSet<>();
public int[] sum(int a[], int b[]) {
for (int i = 0; i < a.length; i++) {
set.add(a[i]);
}
for (int j = 0; j < b.length; j++) {
set.add(b[j]);
}
return set.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
}
数组的交集
第一种方式:
可以利用java的api方法retainAll()
retainAll方法的解释是:retainAll()方法用于保留 arraylist 中在指定集合中也存在的那些元素,也就是删除指定集合中不存在的那些元素。就是求交集的意思
详情见:https://www.runoob.com/java/java-arraylist-retainall.html
有人说,写算法时不让直接用api方法,这样的话可以用Set的去重机制去解决,在上面我们利用Set去重求了数组的并集,同样我们可以利用这个特性求交集。
如下所示
List<Integer> a1 = new ArrayList<>();
ArrayList<Integer> b1 = new ArrayList<>();
int a[] = {1, 3, 5, 7};
int b[] = {2, 3, 4, 9};
//求两个数组的交集(第一种方式:利用集合类的retainAll()方法)
public int[] retain(int a[], int b[]) {
for (int i = 0; i < a.length; i++) {
a1.add(a[i]);
}
for (int j = 0; j < b.length; j++) {
b1.add(b[j]);
}
b1.retainAll(a1);
return b1.stream().mapToInt(i -> i).toArray();//List集合转为int数组
}
第二种方式
①遍历其中一个数组,然后添加到Set集合中;
②遍历另外一个数组,判断每个数是否已存在于Set集合;若已存在,把当前数保存起来,最后把保存起来的数返回即可。
如下所示
Set<Integer> set = new HashSet<>();
Set<Integer> result = new HashSet<>();
int a[] = {1, 3, 5, 7};
int b[] = {2, 3, 4, 9};
//求两个数组的交集(第二种方式:利用set去重)
public int[] retain2(int a[], int b[]) {
for (int i : a) {
set.add(i);
}
for (int i : b) {
if (set.contains(i)) {
result.add(i);
}
}
return result.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
}
总结
求数组并集和交集完整代码如下:
public class SumandRetain {
Set<Integer> set = new HashSet<>();
List<Integer> a1 = new ArrayList<>();
List<Integer> b1 = new ArrayList<>();
int a[] = {1, 3, 5, 7};
int b[] = {2, 3, 4, 9};
//求两个数组的并集(利用Set的去重机制)
public int[] sum(int a[], int b[]) {
for (int i = 0; i < a.length; i++) {
set.add(a[i]);
}
for (int j = 0; j < b.length; j++) {
set.add(b[j]);
}
return set.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
}
//求两个数组的交集(第一种方式:利用集合类的retainAll()方法)
public int[] retain(int a[], int b[]) {
for (int i = 0; i < a.length; i++) {
a1.add(a[i]);
}
for (int j = 0; j < b.length; j++) {
b1.add(b[j]);
}
b1.retainAll(a1);
return b1.stream().mapToInt(i -> i).toArray();//List集合转为int数组
}
//求两个数组的交集(第二种方式:利用set去重)
public int[] retain2(int a[], int b[]) {
Set<Integer> result = new HashSet<>();
for (int i : a) {
set.add(i);
}
for (int i : b) {
if (set.contains(i)) {
result.add(i);
}
}
return result.stream().mapToInt(i -> i).toArray();//Set集合转为int数组
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了