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数组
}
}

浙公网安备 33010602011771号