java如何獲取兩個List集合之間的交集、差集、并集
前言
本文總結(jié)一下java中獲取兩個List之間的交集、補(bǔ)集、并集的幾種方式。
最常用的通過for循環(huán)遍歷兩個集合的方式在這里就不整理了,主要整理一些已經(jīng)封裝或提供出來的方法。
方式一、jdk8 Stream求交集、并集、差集
利用jdk8的新特性Stream流進(jìn)行求交集、并集、差集。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Test { public static void main(String[] args) { List<String> list1 = new ArrayList<>(Arrays.asList("a","b","c")); List<String> list2 = new ArrayList<>(Arrays.asList("b","c","d")); System.out.println("交集:"+intersect(list1,list2)); System.out.println("差集:"+minus(list1,list2)); System.out.println("并集:"+union(list1,list2)); } /** * 交集 * @param list1 * @param list2 * @return */ private static List<String> intersect(List<String> list1, List<String> list2) { List<String> intersect = list1.stream().filter(item -> list2.contains(item)).collect(Collectors.toList()); return intersect; } /** * 差集(list1-list2) * @param list1 * @param list2 * @return */ private static List<String> minus(List<String> list1, List<String> list2) { List<String> minus = list1.stream().filter(item -> !list2.contains(item)).collect(Collectors.toList()); return minus; } /** * 并集(不去重) * @param list1 * @param list2 * @return */ private static List<String> unionAll(List<String> list1, List<String> list2) { list1.addAll(list2); return list1; } /** * 并集(去重) * @param list1 * @param list2 * @return */ private static List<String> union(List<String> list1, List<String> list2) { list1.addAll(list2); return list1.stream().distinct().collect(Collectors.toList()); } }
執(zhí)行結(jié)果:
交集:[b, c]
差集:[a]
并集:[a, b, c, d]
方式二、求交集
利用ArrayList提供的方法求交集。
方法 | 含義 | 備注 |
---|---|---|
boolean retainAll | 求兩個list的交集 | list1.retainAll(list2),注意:此操作會直接刪除list1中的元素 |
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Test { public static void main(String[] args) { List<String> list1 = new ArrayList<>(Arrays.asList("a","b","c")); List<String> list2 = new ArrayList<>(Arrays.asList("b","c","d")); // boolean retainAll 刪除兩個集合不同的元素 // 注意:此操作會直接刪除list1中的元素 System.out.println(list1.retainAll(list2)); System.out.println("集合1:"+list1); System.out.println("集合2:"+list2); } }
執(zhí)行結(jié)果:
true
集合1:[b, c]
集合2:[b, c, d]
- list1.retainAll(list2), 調(diào)用完成后, list1 中不在 list2 的元素都會被剔除, 此時 list1 就是交集
方式三、collections4.CollectionUtils求交集、差集、并集
利用org.apache.commons.collections4.CollectionUtils類中的方法求交集
方法 | 含義 |
---|---|
CollectionUtils.intersection(list1,list2) | 求兩個list的交集,即共有的部分 |
CollectionUtils.union(list1,list2) | 取并集(去重) |
CollectionUtils.subtract(list1,list2) | 取差集,給定倆集合A、B,由所有屬于A且不屬于B的元素組成的集合,叫做集合A減集合B(或集合A與集合B之差) |
CollectionUtils.disjunction(list1,list2) | 取交集的補(bǔ)集。(補(bǔ)集一般指絕對補(bǔ)集,即一般地,設(shè)S是一個集合,A是S的一個子集,由S中所有不屬于A的元素組成的集合,叫做子集A在S中的絕對補(bǔ)集) |
引入依賴:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections4</artifactId> <version>4.4</version> </dependency>
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ArrayUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Test { public static void main(String[] args) { List<String> list1 = new ArrayList<>(Arrays.asList("a","b","c")); List<String> list2 = new ArrayList<>(Arrays.asList("b","c","d")); //intersection: 取交集 List<String> sameList = CollectionUtils.intersection(list1,list2).stream().collect(Collectors.toList()); System.out.println("交集:"+sameList); //取并集(去重) System.out.println("并集:"+ ArrayUtils.toString(CollectionUtils.union(list1,list2))); //取差集 System.out.println("差集:"+CollectionUtils.subtract(list1,list2)); //取兩個集合的交集的補(bǔ)集(補(bǔ)集一般指絕對補(bǔ)集,即一般地,設(shè)S是一個集合,A是S的一個子集,由S中所有不屬于A的元素組成的集合,叫做子集A在S中的絕對補(bǔ)集) System.out.println("補(bǔ)集:"+CollectionUtils.disjunction(list1,list2)); } }
執(zhí)行結(jié)果:
交集:[b, c]
并集:[a, b, c, d]
差集:[a]
補(bǔ)集:[a, d]
總結(jié)
到此這篇關(guān)于java如何獲取兩個List集合之間的交集、差集、并集的文章就介紹到這了,更多相關(guān)java獲取List集合的交集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java9新特性Stream流API優(yōu)化與增強(qiáng)
這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強(qiáng)的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪2022-03-03SpringBoot 使用jwt進(jìn)行身份驗(yàn)證的方法示例
這篇文章主要介紹了SpringBoot 使用jwt進(jìn)行身份驗(yàn)證的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12SpringBoot org.springframework.beans.factory.Unsatisfie
本文主要介紹了SpringBoot org.springframework.beans.factory.UnsatisfiedDependencyException依賴注入異常,文中通過示例代碼介紹的很詳細(xì),具有一定的參考價值,感興趣的可以了解一下2024-02-02解決cmd執(zhí)行javac報(bào)錯:不是內(nèi)部或外部命令,也不是可運(yùn)行的程序
剛接觸JAVA的新手可能就不知道怎么解決'JAVAC'不是內(nèi)部命令或外部命令,這篇文章主要給大家介紹了關(guān)于解決cmd執(zhí)行javac報(bào)錯:不是內(nèi)部或外部命令,也不是可運(yùn)行的程序的相關(guān)資料,需要的朋友可以參考下2023-11-11jackson 實(shí)現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼
這篇文章主要介紹了jackson 實(shí)現(xiàn)null轉(zhuǎn)0 以及0轉(zhuǎn)null的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09SpringBoot高版本修改為低版本時測試類報(bào)錯的解決方案
這篇文章主要介紹了SpringBoot高版本修改為低版本時測試類報(bào)錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09File的API和常用方法詳解_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了File的API和常用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05