基本概念
为了便于理解,下面首先介绍集合的三个基本操作:并集、交集和补集。
并集:以属于A或属于B的元素为元素的集合称为A与B的并(集),记作A∪B(或B∪A),读作“A并B”(或“B并A”),即A∪B={x|x∈A,或x∈B}。
交集: 以属于A且属于B的元素为元素的集合称为A与B的交(集),记作A∩B(或B∩A),读作“A交B”(或“B交A”),即A∩B={x|x∈A,且x∈B}。
在集合论和数学的其他分支中,存在补集的两种定义:相对补集和绝对补集。
绝对补集:属于全集U不属于集合A的元素组成的集合称为集合A的补集,记作CuA,即CuA={x|x∈U,且x不属于A}。补集一般指绝对补集。
相对补集(差集):若A 和B 是集合,则A 在B 中的相对补集是这样一个集合:其元素属于B但不属于A,B -A = { x| x∈B且x∉A}。
举例:令集合A={1,2,3,4,5},集合B={1,2,3,10},则差集:B-A={10}。
在介绍集合实现方法之前,先介绍一下本文要用到的包:
import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
本文基于Java 8进行测试,采用的Guava版本为
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>29.0-jre</version> </dependency>
Jdk中的操作
定义两个Integer类型的非空集合set1和set2,则在使用JDK中的方法,可以实现集合的交集、并集和差集,方法如下:
交集 set1.retainAll(set2);
并集 set1.addAll(set2);
差集 or 补集 set1.removeAll(set2)。
温馨提示,它们都是把结果集记录在set1中,使用的时候需要留意。
Guava Sets操作
@Test
public void setOperation() {
Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.newHashSet(3, 4, 5, 6, 7, 9);
Sets.SetView<Integer> intersection = Sets.intersection(set1, set2);
LOGGER.info("交集为:{}", intersection.toString());//[3, 4, 5]
Sets.SetView<Integer> union = Sets.union(set1, set2);
LOGGER.info("并集为:{}", union.toString());//[1, 2, 3, 4, 5, 6, 7, 9]
Sets.SetView<Integer> diff = Sets.difference(set1, set2);
LOGGER.info("差集为:{}", diff.toString());//[1, 2]
set1.retainAll(set2);
LOGGER.info("jdk中求交集:{}", set1);
}
Apache CollectionUtils
org.apache.commons.collections4.CollectionUtils同样实现了集合的交集、并集和差集,方法如下:
@Test
public void CollectionUtilsOperation() {
Set<Integer> set1 = Sets.newHashSet(1, 2, 3, 4, 5);
Set<Integer> set2 = Sets.newHashSet(3, 4, 5, 6, 7, 9);
Collection<Integer> col = CollectionUtils.retainAll(set1, set2);
LOGGER.info("交集为:{}", col.toString());
col = CollectionUtils.union(set1, set2);
LOGGER.info("并集为:{}", col.toString());
col = CollectionUtils.subtract(set1, set2);
LOGGER.info("补集为:{}", col.toString());
}