java如何獲取兩個List集合之間的交集、差集、并集
前言
本文總結一下java中獲取兩個List之間的交集、補集、并集的幾種方式。
最常用的通過for循環(huán)遍歷兩個集合的方式在這里就不整理了,主要整理一些已經封裝或提供出來的方法。
方式一、jdk8 Stream求交集、并集、差集
利用jdk8的新特性Stream流進行求交集、并集、差集。
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í)行結果:
交集:[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í)行結果:
true
集合1:[b, c]
集合2:[b, c, d]
- list1.retainAll(list2), 調用完成后, 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) | 取交集的補集。(補集一般指絕對補集,即一般地,設S是一個集合,A是S的一個子集,由S中所有不屬于A的元素組成的集合,叫做子集A在S中的絕對補集) |
引入依賴:
<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));
//取兩個集合的交集的補集(補集一般指絕對補集,即一般地,設S是一個集合,A是S的一個子集,由S中所有不屬于A的元素組成的集合,叫做子集A在S中的絕對補集)
System.out.println("補集:"+CollectionUtils.disjunction(list1,list2));
}
}
執(zhí)行結果:
交集:[b, c]
并集:[a, b, c, d]
差集:[a]
補集:[a, d]
總結
到此這篇關于java如何獲取兩個List集合之間的交集、差集、并集的文章就介紹到這了,更多相關java獲取List集合的交集內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot org.springframework.beans.factory.Unsatisfie
本文主要介紹了SpringBoot org.springframework.beans.factory.UnsatisfiedDependencyException依賴注入異常,文中通過示例代碼介紹的很詳細,具有一定的參考價值,感興趣的可以了解一下2024-02-02
解決cmd執(zhí)行javac報錯:不是內部或外部命令,也不是可運行的程序
剛接觸JAVA的新手可能就不知道怎么解決'JAVAC'不是內部命令或外部命令,這篇文章主要給大家介紹了關于解決cmd執(zhí)行javac報錯:不是內部或外部命令,也不是可運行的程序的相關資料,需要的朋友可以參考下2023-11-11
jackson 實現(xiàn)null轉0 以及0轉null的示例代碼
這篇文章主要介紹了jackson 實現(xiàn)null轉0 以及0轉null的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
SpringBoot高版本修改為低版本時測試類報錯的解決方案
這篇文章主要介紹了SpringBoot高版本修改為低版本時測試類報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
File的API和常用方法詳解_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了File的API和常用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05

