在初中代数中,我们经常会求两个集合的并集、交集、差集等,在Java中也存在着此 类运算,那如何实现呢? 一提到此类集合操作,大部分的实现者都会说:对两个集合进行遍




历,即可求出结果。是的,遍历可以实现并集、交集、差集等运算,但这不是最优雅的处理方式。下面来看看如何进行更优雅、快速、方便的集合操作。

(1)  并集

也叫做合集,把两个集合加起来即可,这非常简单,代码如下:

public static void main(String[] args) {
   List<String> listl = new ArrayList<String>();listl.add("A"); listl.add("B");
   List<String>list2 = new ArrayList<String>(); list2.add("C");list2 .addC'B");
   //并集
   listl.addAll(list2);
}

此时,listl中就是两个列表的并集元素了。

(2)  交集

计算两个集合的共有元素,也就是你有我也有的元素集合,代码如下:

     listl.retainAll(list2);

其中的变量listl和list2是两个列表,仅此一句话,listl中就只包含listl、list2中共有 的元素了。注意retainAll方法会删除listl中没有出现在list2中的元素。

(3)  差集

由所有属于A但不属于B的元素组成的集合,叫做A与B的差集,也就是我有你没有

的元素,代码如下:

     listl.removeAll(list2);

也很简单,从listl中删除出现在lis2的元素,即可得出listl与list2的差集部分。

(4)  无重复的并集

什么叫无重复的并集?并集是集合A加集合B,那如果集合A和集合B有交集(也就 是并集的元素数量大于〇),就需要确保并集的结果中只有一份交集,此为无重复的并集。此操作也比较简单,代码如下:

//硎除在listl中出现的元素
      list2.removeAll(listl);
//把剩余的list2元素加到listl中
     listl.addAll(list2);

有读者可能说了,求出两个集合的并集,然后转变成HashSet剔除重复元素不就解决 问题了吗?错了,这样解决是不行的,比如集合A有10个元素(其中有两个元素值是相同 的),集合B有8个元素,它们的交集有2个元素,我们可以计算出它们的并集是18个元素,而无重复的并集有16个元素,但是如果使用HashSet算法,算出来则只有15个元素, 因为你把集合A中原本就重复的元素也剔除掉了。

读者可能会很困惑,为什么要介绍并集、交集、差集呢?那是因为只要去检査一下代码,就会发现,很少有程序员使用JDK提供的方法来实现这些集合操作,基本上都是采用的 标准的嵌套for循环:要并集就是加法,要交集了就使用contains判断是否存在,要差集了 就使用!contains (不包含),有时候还要为这类操作提供一个单独方法,看似很规范,但已 经脱离了优雅的味道。

集合的这些操作在持久层中使用得非常频繁,从数据库中取出的就是多个数据集合,之后我们就可以使用集合的各种方法构建我们需要的数据了,需要两个集合的and结果,那是 交集,需要两个集合的or结果,那是并集,需要两个集合的not结果,那是差集。