Java兩個(gè)集合取差集4種方式舉例
開發(fā)中比較兩個(gè)集合的不同點(diǎn),例如需要對于兩個(gè)集合取差集,下面列舉了幾種方式。
方式1:使用Java 8的Stream流
整個(gè)集合過濾
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ù)項(xiàng)目需求和已引入的庫,選擇合適的方法來計(jì)算集合的差集。
附:取重復(fù)元素
方法一:使用HashSet
import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class ListUtils { /** * 找出兩個(gè)List中的重復(fù)元素 * @param list1 第一個(gè)List * @param list2 第二個(gè)List * @return 重復(fù)的元素集合 */ public static <T> List<T> findDuplicateElements(List<T> list1, List<T> list2) { Set<T> set1 = new HashSet<>(list1); // 將List1轉(zhuǎn)換為Set,去除重復(fù)元素 Set<T> duplicateSet = new HashSet<>(); for (T element : list2) { // 遍歷List2的元素 if (set1.contains(element)) { // 如果Set1中包含List2的元素 duplicateSet.add(element); // 將重復(fù)的元素添加到重復(fù)元素的Set中 } } return new ArrayList<>(duplicateSet); // 將重復(fù)元素的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(); // 找出兩個(gè)Stream的重復(fù)元素 List<Integer> commonElements = Stream.concat(stream1, stream2) .distinct() .collect(Collectors.toList()); // 打印出重復(fù)元素 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的鍵,即為重復(fù)元素 List<Integer> commonElements = map.entrySet().stream() .filter(x -> x.getValue() > 1) .map(Map.Entry::getKey) .collect(Collectors.toList()); // 打印出重復(fù)元素 System.out.println(commonElements); } }
總結(jié)
到此這篇關(guān)于Java兩個(gè)集合取差集4種方式的文章就介紹到這了,更多相關(guān)Java兩個(gè)集合取差集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot集成Hutool防止XSS攻擊的兩種解決方法
XSS漏洞是生產(chǎn)上比較常見的問題,本文主要介紹了SpringBoot集成Hutool防止XSS攻擊的兩種解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04使用Spring?Cloud?Stream處理Java消息流的操作流程
Spring?Cloud?Stream是一個(gè)用于構(gòu)建消息驅(qū)動微服務(wù)的框架,能夠與各種消息中間件集成,如RabbitMQ、Kafka等,今天我們來探討如何使用Spring?Cloud?Stream來處理Java消息流,需要的朋友可以參考下2024-08-08java高效打印一個(gè)二維數(shù)組的實(shí)例(不用遞歸,不用兩個(gè)for循環(huán))
下面小編就為大家?guī)硪黄猨ava高效打印一個(gè)二維數(shù)組的實(shí)例(不用遞歸,不用兩個(gè)for循環(huán))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03Mybatis開發(fā)環(huán)境搭建實(shí)現(xiàn)數(shù)據(jù)的增刪改查功能
這篇文章主要介紹了 Mybatis開發(fā)環(huán)境搭建實(shí)現(xiàn)數(shù)據(jù)的增刪改查功能,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Springboot多環(huán)境開發(fā)及使用方法
這篇文章主要介紹了Springboot多環(huán)境開發(fā)及多環(huán)境設(shè)置使用、多環(huán)境分組管理的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03Java實(shí)現(xiàn)多用戶注冊登錄的幸運(yùn)抽獎
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多用戶注冊登錄的幸運(yùn)抽獎,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-11-11Java實(shí)現(xiàn)手寫乞丐版線程池的示例代碼
在這篇文章當(dāng)中我們主要介紹實(shí)現(xiàn)一個(gè)非常簡易版的線程池,深入的去理解其中的原理,麻雀雖小,五臟俱全,感興趣的小伙伴快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-10-10java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換
本文介紹在java中IP地址轉(zhuǎn)換十進(jìn)制數(shù)及把10進(jìn)制再轉(zhuǎn)換成IP地址的方法及實(shí)例參考,曬出來和大家分享一下2012-12-12