java 的交并补_【Java】两个ArrayList之间求交并补

本文介绍了如何在Java中使用ArrayList进行交集、并集和补集的计算,包括使用retainAll()、removeAll()方法以及自定义方法实现。通过示例代码详细展示了运算过程。
摘要由CSDN通过智能技术生成

同样的方法应该也使用在《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)中提及到Java中的各类集合,这里拿各位编程最常用的Array

同样的方法应该也使用在《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)中提及到Java中的各类集合,这里拿各位编程最常用的ArrayList做例子。这个东西除了用来做可变形数组以外,有时候还会出现要在两个ArrayList之间进行集合运算,我在这里举出最常见的求交并补的例子,其余的复杂的集合运算,请自己打开《离散数学》或者《数理逻辑》一书慢慢推导吧。我们是程序猿,不是数学家,要在两个ArrayList之间求交并补已经很少见了,何况其它……

这里的交并补不需要通过for循环等实现,这里类本身封装好方法。

1、首先是最简单的交集,用一个已经封装好的retainAll就解决问题了:

比如以下的语句段,设置一个{1,2,3}与{3,4}的ArrayList求交:

ArrayList arraylist1 = new ArrayList();

ArrayList arraylist2 = new ArrayList();

arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);

arraylist2.add(3);arraylist2.add(4);

arraylist1.retainAll(arraylist2);

System.out.println("Arraylist1∩Arraylist2="+arraylist1);就可以得到如下的运行结果:

Arraylist1∩Arraylist2=[3]

这里值得注意的是,不要写成:arraylist1=arraylist1.retainAll(arraylist2);,arraylist1.retainAll(arraylist2);本身就完成arraylist1与arraylist2求交,并且更新arraylist1的操作,arraylist1.retainAll(arraylist2);执行成功则返回一个true,当然,我就从来没见过它执行失败,返回false的。arraylist1是一个存放整形的ArrayList,根本就不能相等,这样写Eclipse绝对会报错。这里求交集arraylist1与arraylist2的顺序没有问题的,只是求完之后更新哪个arraylist的问题。

2、之后是求补集,也是用一个封装好的removeAll就解决问题:

比如以下的语句段,设置一个{3}对于全集{1,2,3}求补:

ArrayList arraylist1 = new ArrayList();

ArrayList arraylist2 = new ArrayList();

arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);

arraylist2.add(3);

arraylist1.removeAll(arraylist2);

System.out.println("┐Arraylist2(对于Arraylist1)="+arraylist1);运行结果如下:

┐Arraylist2(对于Arraylist1)=[1, 2]

这里要注意的问题同上面的交集,如果你这样写,以下是错误示范:

ArrayList arraylist1 = new ArrayList();

ArrayList arraylist2 = new ArrayList();

arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);

arraylist2.add(3);

System.out.println("┐Arraylist2(对于Arraylist1)"+arraylist1.removeAll(arraylist2));

那么则得到下面的运行结果:

┐Arraylist2(对于Arraylist1)true

而不是┐Arraylist2(对于Arraylist1)=[1, 2],原因同交集

3、并集则不同,这里没有封装好方法,,我们写一个方法,把要求并的两个ArrayList的所有元素叠加在一起,再去重,去重可以利用上次我在《【Java】为ArrayList去重》(点击打开链接)介绍的方法

比如:

import java.util.*;

class ArraylistCalculate{

// 两个整数集求并集

public ArrayList integerArrayListUnion(

ArrayList arraylist1, ArrayList arraylist2) {

ArrayList arraylist = new ArrayList();

arraylist.addAll(arraylist1);

arraylist.addAll(arraylist2);

arraylist = new ArrayList(new HashSet(arraylist));

return arraylist;

}

}

public class JavaArraylistCalculate {

public static void main(String args[]){

ArrayList arraylist1 = new ArrayList();

ArrayList arraylist2 = new ArrayList();

arraylist1.add(1);arraylist1.add(2);arraylist1.add(3);

arraylist2.add(3);arraylist2.add(4);

System.out.println("Arraylist1∪Arraylist2="+new ArraylistCalculate().integerArrayListUnion(arraylist1, arraylist2));

}

}

运行结果如下:

Arraylist1∪Arraylist2=[1, 2, 3, 4]

当然,我们也可以把上述介绍得两个ArrayList之间求交并补的所有方法封装起来,得到如下的类:

class ArraylistCalculate{

// 两个整数集求差集

public ArrayList integerArrayListDifference(

ArrayList arraylist1, ArrayList arraylist2) {

arraylist1.removeAll(arraylist2);

return arraylist1;

}

// 两个整数集求并集

public ArrayList integerArrayListUnion(

ArrayList arraylist1, ArrayList arraylist2) {

ArrayList arraylist = new ArrayList();

arraylist.addAll(arraylist1);

arraylist.addAll(arraylist2);

arraylist = new ArrayList(new HashSet(arraylist));

return arraylist;

}

// 两个整数集求交集

public ArrayList integerArrayListIntersections(

ArrayList arraylist1, ArrayList arraylist2) {

arraylist1.retainAll(arraylist2);

return arraylist1;

}

}

需要的时候调用就可以了。

当然,由于用到了ArrayList请注意在开头引用import java.util.*;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值