1 明确概念
首先知道几个单词的意思:
- 并集 = union
- 交集 = intersection
- 补集 = complement
- 析取 = disjunction
- 减去 = subtract
1.1 并集
对于两个给定集合a、b,由两个集合所有元素构成的集合,叫做a和b的并集。
记作:aub 读作“a并b”
例:{3,5}u{2,3,4,6}= {2,3,4,5,6}
1.2 交集
对于两个给定集合a、b,由属于a又属于b的所有元素构成的集合,叫做a和b的交集。
记作: a∩b 读作“a交b”
例:a={1,2,3,4,5},b={3,4,5,6,8},a∩b={3,4,5}
1.3 补集
一般地,设s是一个集合,a是s的一个子集,由s中所有不属于a的元素组成的集合,叫做子集a在s中的绝对补集。
记作:∁ua,包括三层含义:
1)a是u的一个子集,即a⊊u;
2)∁ua表示一个集合,且∁ua⊊u;
3)∁ua是由u中所有不属于a的元素组成的集合,∁ua与a没有公共元素,u中的元素分布在这两个集合中。
2 使用apache工具包
2.1 导入依赖
<!-- apache 集合工具类 --> <dependency> <groupid>org.apache.commons</groupid> <artifactid>commons-collections4</artifactid> <version>4.1</version> </dependency>
2.2 代码如下:
public static final list<string> list1 = arrays.aslist("a", "b", "c", "d", "e", "f", null); public static final list<string> list2 = arrays.aslist("1", "2", "3", "d", "e", "f", null); /** * apache测试方法 */ @test public void apachetest() { system.out.println("交集:" + collectionutils.intersection(list1, list2)); // 交集 system.out.println("补集:" + collectionutils.disjunction(list1, list2)); // 补集 system.out.println("并集:" + collectionutils.union(list1, list2)); // 并集 system.out.println("list1的差集:" + collectionutils.subtract(list1, list2)); // list1的差集 system.out.println("list2的差集:" + collectionutils.subtract(list2, list1)); // list2的差集 }
输出:
3 使用hutool工具包
3.1 导入依赖
<!-- hutool工具类 --> <dependency> <groupid>cn.hutool</groupid> <artifactid>hutool-all</artifactid> <version>5.8.12</version> </dependency>
3.2 代码如下:
public static final list<string> list1 = arrays.aslist("a", "b", "c", "d", "e", "f", null); public static final list<string> list2 = arrays.aslist("1", "2", "3", "d", "e", "f", null); /** * hutool工具类 */ @test public void hutooltest() { system.out.println("交集:" + collectionutil.intersection(list1, list2)); // 交集 system.out.println("补集:" + collectionutil.disjunction(list1, list2)); // 补集 system.out.println("并集:" + collectionutil.union(list1, list2)); //并集 system.out.println("list1的差集"+collectionutil.subtract(list1,list2)); system.out.println("list2的差集"+collectionutil.subtract(list2,list1)); system.out.println("list1的差集:" + collectionutil.subtracttolist(list1, list2)); system.out.println("list2的差集:" + collectionutil.subtracttolist(list2, list1)); }
输出:
3.3 注意
subtract()和subtracttolist()作用一样,不过处理方式不同,使用subtract()时,参数不能是arrays.aslist()的结果,否则会报异常,因为arrays.aslist()返回的对象是arrays.arraylist,在方法实现里面调用的是abstractlist抽象类里面的removeall()方法,该方法代码如下:
public abstract class abstractlist<e> extends abstractcollection<e> implements list<e> { // .... public e remove(int index) { throw new unsupportedoperationexception(); } // .... }
4 使用stream方式
4.1 代码如下:
public static final list<string> list1 = arrays.aslist("a", "b", "c", "d", "e", "f", null); public static final list<string> list2 = arrays.aslist("1", "2", "3", "d", "e", "f", null); /** * stream方式 */ @test public void streamtest() { list<object> intersection = list1.stream().filter(list2::contains).collect(collectors.tolist()); system.out.println("交集:" + intersection); list<string> subtract1 = list1.stream().filter(s -> !list2.contains(s)).collect(collectors.tolist()); system.out.println("集合list1的差集:" + subtract1); list<string> subtract2 = list2.stream().filter(s -> !list1.contains(s)).collect(collectors.tolist()); system.out.println("集合list2的差集:" + subtract2); list<string> union1 = list1.parallelstream().collect(collectors.tolist()); list<string> union2 = list2.parallelstream().collect(collectors.tolist()); union1.addall(union2); list<string> union3 = union1.stream().distinct().collect(collectors.tolist()); system.out.println("并集:" + union3); }
输出:
5 使用collection接口中的方法
5.1 代码如下:
public static string[] attr1 = new string[]{"a", "b", "c", "d", "e", "f", null}; public static string[] attr2 = new string[]{"1", "2", "3", "d", "e", "f", null}; /** * 使用collection接口中的方法 */ @test public void collectiontest() { list<string> list1 = new arraylist<>(arrays.aslist(attr1)); list<string> list2 = new arraylist<>(arrays.aslist(attr2)); list1.retainall(list2); system.out.println("交集:" + list1); arraylist<string> list3 = new arraylist<>(arrays.aslist(attr1)); arraylist<string> list4 = new arraylist<>(arrays.aslist(attr2)); set<object> set = new hashset<>(); set.addall(list3); set.addall(list4); system.out.println("并集:" + set); arraylist<string> list5 = new arraylist<>(arrays.aslist(attr1)); arraylist<string> list6 = new arraylist<>(arrays.aslist(attr2)); list5.removeall(list6); system.out.println("集合a的差集:" + list5); arraylist<string> list7 = new arraylist<>(arrays.aslist(attr1)); arraylist<string> list8 = new arraylist<>(arrays.aslist(attr2)); list8.removeall(list7); system.out.println("集合b的差集:" + list8); }
输出:
到此结束!!!
以上就是java获取两个集合list的交集、补集、并集(相加)和差集(相减)的几种方式的详细内容,更多关于java获取两个list交集、补集、并集和差集的资料请关注代码网其它相关文章!
发表评论