Java兩個集合取差集4種方式舉例
開發(fā)中比較兩個集合的不同點,例如需要對于兩個集合取差集,下面列舉了幾種方式。
方式1:使用Java 8的Stream流
整個集合過濾
List<String> list1 = Arrays.asList("a", "b", "c", "d");
List<String> list2 = Arrays.asList("c", "d", "e", "f");
// 獲取差集
List<String> difference1 = list1.stream()
.filter(element -> !list2.contains(element))
.collect(Collectors.toList());
// 獲取list2中不在list1的元素
List<String> difference2 = list2.stream()
.filter(element -> !list1.contains(element))
.collect(Collectors.toList());
根據(jù)集合中對象的屬性來過濾
// 根據(jù)集合中對象的name屬性來過濾
public void testStreamNoneMatch(List<StudentDTO> originalDto, List<StudentDTO> newDto) {
List<StudentDTO> boy = originalDto.stream()
.filter(item -> item.getGender() == 1
&& newDto.stream().anyMatch(dto -> dto.getName().equals(item.getName()))).collect(Collectors.toList());
log.info("性別為男生,且名字相同的人員為{}", JSONObject.toJSONString(boy));
}
方式2:使用Java集合類的removeAll()方法
List<String> list1Copy = new ArrayList<>(list1); List<String> list2Copy = new ArrayList<>(list2); // 獲取list1中不在list2的元素 list1Copy.removeAll(list2); List<String> difference1 = list1Copy; // 獲取list2中不在list1的元素 list2Copy.removeAll(list1); List<String> difference2 = list2Copy;
方式3:使用Google Guava庫的Sets.difference()方法
List<String> list1 = ...; List<String> list2 = ...; // 獲取list1中不在list2的元素 Set<String> set1 = Sets.newHashSet(list1); Set<String> set2 = Sets.newHashSet(list2); Set<String> difference1 = Sets.difference(set1, set2); // 獲取list2中不在list1的元素 Set<String> difference2 = Sets.difference(set2, set1);
方式4:使用Apache Commons Collections的ListUtils.subtract()方法
List<String> list1 = ...; List<String> list2 = ...; // 獲取list1中不在list2的元素 List<String> difference1 = ListUtils.subtract(list1, list2); // 獲取list2中不在list1的元素 List<String> difference2 = ListUtils.subtract(list2, list1);
注意:方式有很多,大家可根據(jù)項目需求和已引入的庫,選擇合適的方法來計算集合的差集。
附:取重復元素
方法一:使用HashSet
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class ListUtils {
/**
* 找出兩個List中的重復元素
* @param list1 第一個List
* @param list2 第二個List
* @return 重復的元素集合
*/
public static <T> List<T> findDuplicateElements(List<T> list1, List<T> list2) {
Set<T> set1 = new HashSet<>(list1); // 將List1轉(zhuǎn)換為Set,去除重復元素
Set<T> duplicateSet = new HashSet<>();
for (T element : list2) { // 遍歷List2的元素
if (set1.contains(element)) { // 如果Set1中包含List2的元素
duplicateSet.add(element); // 將重復的元素添加到重復元素的Set中
}
}
return new ArrayList<>(duplicateSet); // 將重復元素的Set轉(zhuǎn)換回List并返回
}
}
方法二:使用Stream API
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
// 將列表轉(zhuǎn)換為Stream
Stream<Integer> stream1 = list1.stream();
Stream<Integer> stream2 = list2.stream();
// 找出兩個Stream的重復元素
List<Integer> commonElements = Stream.concat(stream1, stream2)
.distinct()
.collect(Collectors.toList());
// 打印出重復元素
System.out.println(commonElements);
}
}
方法三:使用HashMap
import java.util.*;
public class Main {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8);
// 將列表轉(zhuǎn)換為HashMap
Map<Integer, Integer> map = new HashMap<>();
list1.forEach(i -> map.put(i, map.getOrDefault(i, 0) + 1));
list2.forEach(i -> map.put(i, map.getOrDefault(i, 0) + 1));
// 找出HashMap中值大于1的鍵,即為重復元素
List<Integer> commonElements = map.entrySet().stream()
.filter(x -> x.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
// 打印出重復元素
System.out.println(commonElements);
}
}總結(jié)
到此這篇關(guān)于Java兩個集合取差集4種方式的文章就介紹到這了,更多相關(guān)Java兩個集合取差集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
獲取Spring的上下文環(huán)境ApplicationContext的最簡單方式
這篇文章主要介紹了獲取Spring的上下文環(huán)境ApplicationContext的最簡單方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08
Java中策略設(shè)計模式的實現(xiàn)及應(yīng)用場景
策略設(shè)計模式是Java中一種常用的設(shè)計模式,它通過定義一系列算法并將其封裝成獨立的策略類,從而使得算法可以在不影響客戶端的情況下隨時切換。策略設(shè)計模式主要應(yīng)用于系統(tǒng)中存在多種相似的算法、需要靈活調(diào)整算法邏輯或者需要擴展新的算法等場景2023-04-04
詳解Java動態(tài)代理的實現(xiàn)及應(yīng)用
這篇文章主要介紹了詳解Java動態(tài)代理的實現(xiàn)及應(yīng)用的相關(guān)資料,希望通過本文大家能理解掌握Java動態(tài)代理的使用方法,需要的朋友可以參考下2017-09-09
springboot手動動態(tài)注入controller和service方式
這篇文章主要介紹了springboot手動動態(tài)注入controller和service方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
idea運行java的配置詳細教程(包含maven,mysql下載配置)
程序員們在開發(fā)的時候,一定會用到Intellij?IDEA這個集成開發(fā)環(huán)境,這篇文章主要給大家介紹了關(guān)于idea運行java的配置(包含maven,mysql下載配置)的相關(guān)資料,需要的朋友可以參考下2024-05-05
Java基于redis和mysql實現(xiàn)簡單的秒殺(附demo)
這篇文章主要介紹了Java基于redis和mysql實現(xiàn)簡單的秒殺(附demo),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
Spring占位符Placeholder的實現(xiàn)原理解析
這篇文章主要介紹了Spring占位符Placeholder的實現(xiàn)原理,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03

