同样的方法应该也使用在《【Java】Java中的Collections类——Java中升级版的数据结构》(点击打开链接)中提及到Java中的各类集合,这里拿各位编程最常用的ArrayList做例子。这个东西除了用来做可变形数组以外,有时候还会出现要在两个ArrayList之间进行集合运算,我在这里举出最常见的求交并补的例子,其余的复杂的集合运算,请自己打开《离散数学》或者《数理逻辑》一书慢慢推导吧。我们是程序猿,不是数学家,要在两个ArrayList之间求交并补已经很少见了,何况其它……
这里的交并补不需要通过for循环等实现,这里类本身封装好方法。
1、首先是最简单的交集,用一个已经封装好的retainAll就解决问题了:
比如以下的语句段,设置一个{1,2,3}与{3,4}的ArrayList求交:
ArrayList<Integer> arraylist1 = new ArrayList<Integer>(); ArrayList<Integer> arraylist2 = new ArrayList<Integer>(); 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<Integer>,根本就不能相等,这样写Eclipse绝对会报错。这里求交集arraylist1与arraylist2的顺序没有问题的,只是求完之后更新哪个arraylist的问题。
2、之后是求补集,也是用一个封装好的removeAll就解决问题:
比如以下的语句段,设置一个{3}对于全集{1,2,3}求补:
ArrayList<Integer> arraylist1 = new ArrayList<Integer>(); ArrayList<Integer> arraylist2 = new ArrayList<Integer>(); 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<Integer> arraylist1 = new ArrayList<Integer>(); ArrayList<Integer> arraylist2 = new ArrayList<Integer>(); 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<Integer> integerArrayListUnion( ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) { ArrayList<Integer> arraylist = new ArrayList<Integer>(); arraylist.addAll(arraylist1); arraylist.addAll(arraylist2); arraylist = new ArrayList<Integer>(new HashSet<Integer>(arraylist)); return arraylist; } } public class JavaArraylistCalculate { public static void main(String args[]){ ArrayList<Integer> arraylist1 = new ArrayList<Integer>(); ArrayList<Integer> arraylist2 = new ArrayList<Integer>(); 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<Integer> integerArrayListDifference( ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) { arraylist1.removeAll(arraylist2); return arraylist1; } // 两个整数集求并集 public ArrayList<Integer> integerArrayListUnion( ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) { ArrayList<Integer> arraylist = new ArrayList<Integer>(); arraylist.addAll(arraylist1); arraylist.addAll(arraylist2); arraylist = new ArrayList<Integer>(new HashSet<Integer>(arraylist)); return arraylist; } // 两个整数集求交集 public ArrayList<Integer> integerArrayListIntersections( ArrayList<Integer> arraylist1, ArrayList<Integer> arraylist2) { arraylist1.retainAll(arraylist2); return arraylist1; } }
需要的时候调用就可以了。
当然,由于用到了ArrayList请注意在开头引用import java.util.*;