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

同样的方法应该也使用在《【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.*;


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。