您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“在Java中怎么查找兩個(gè)列表之間的差異”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
1. 概述
查找相同數(shù)據(jù)類型的對(duì)象集合之間的差異是一項(xiàng)常見(jiàn)的編程任務(wù)。舉個(gè)例子,假設(shè)我們有一份申請(qǐng)考試的學(xué)生名單和另一份通過(guò)考試的學(xué)生名單。這兩張名單的區(qū)別會(huì)告訴我們那些沒(méi)有通過(guò)考試的學(xué)生。
在Java中,List API 中沒(méi)有顯式的方法來(lái)查找兩個(gè)列表之間的差異,盡管有一些helper方法非常接近。
2. 測(cè)試設(shè)置
首先定義兩個(gè)列表,我們將用它們來(lái)測(cè)試示例:
public class FindDifferencesBetweenListsUnitTest { private static final List listOne = Arrays.asList("Jack", "Tom", "Sam", "John", "James", "Jack"); private static final List listTwo = Arrays.asList("Jack", "Daniel", "Sam", "Alan", "James", "George"); }
3. 使用 Java List API
我們可以創(chuàng)建一個(gè)列表的副本,然后使用List 的方法removeAll() ,刪除與另一個(gè)相同的所有元素:
List<String> differences = new ArrayList<>(listOne); differences.removeAll(listTwo); assertEquals(2, differences.size()); assertThat(differences).containsExactly("Tom", "John");
讓我們把這個(gè)顛倒過(guò)來(lái),從另一個(gè)角度找出差異:
List<String> differences = new ArrayList<>(listTwo); differences.removeAll(listOne); assertEquals(3, differences.size()); assertThat(differences).containsExactly("Daniel", "Alan", "George");
我們還應(yīng)該注意到,如果我們想找到兩個(gè)列表之間的公共元素,List 還有一個(gè) retainal 方法。
4. 使用 Streams API
Java Stream API 可用于對(duì)集合中的數(shù)據(jù)執(zhí)行順序操作,包括過(guò)濾列表之間的差異:
List<String> differences = listOne.stream() .filter(element -> !listTwo.contains(element)) .collect(Collectors.toList()); assertEquals(2, differences.size()); assertThat(differences).containsExactly("Tom", "John");
與第一個(gè)示例一樣,我們可以切換列表的順序,以從第二個(gè)列表中找到不同的元素:
List<String> differences = listTwo.stream() .filter(element -> !listOne.contains(element)) .collect(Collectors.toList()); assertEquals(3, differences.size()); assertThat(differences).containsExactly("Daniel", "Alan", "George");
注意 List.contains() 對(duì)于較大的列表來(lái)說(shuō),可能是一項(xiàng)成本高昂的操作。
5. 使用第三方庫(kù)
5.1. 使用Google Guava
Guava 包含 Sets.difference 方法, 但要使用它,我們需要先將列表轉(zhuǎn)換為集合:
List<String> differences = new ArrayList<>(Sets.difference(Sets.newHashSet(listOne), Sets.newHashSet(listTwo))); assertEquals(2, differences.size()); assertThat(differences).containsExactlyInAnyOrder("Tom", "John");
注意,將 列表 轉(zhuǎn)換為 集合 會(huì)產(chǎn)生重復(fù)數(shù)據(jù)消除和重新排序的效果。
5.2. 使用 Apache Commons Collections
Apache Commons Collections中的 CollectionUtils 包含 removeAll 方法.
該方法類似于List.removeAll(),同時(shí)也為結(jié)果創(chuàng)建一個(gè)新的集合:
List<String> differences = new ArrayList<>((CollectionUtils.removeAll(listOne, listTwo))); assertEquals(2, differences.size()); assertThat(differences).containsExactly("Tom", "John");
6. 處理重復(fù)值
現(xiàn)在讓我們看看當(dāng)兩個(gè)列表包含重復(fù)值時(shí)的差異。
為了實(shí)現(xiàn)這一點(diǎn),我們需要從第一個(gè)列表中刪除重復(fù)的元素,精確到它們包含在第二個(gè)列表中的次數(shù)
在我們的示例中,“Jack”值在第一個(gè)列表中出現(xiàn)兩次,在第二個(gè)列表中僅出現(xiàn)一次:
List<String> differences = new ArrayList<>(listOne); listTwo.forEach(differences::remove); assertThat(differences).containsExactly("Tom", "John", "Jack");
我們也可以使用Apache Commons Collections中的subtract方法來(lái)實(shí)現(xiàn):
List<String> differences = new ArrayList<>(CollectionUtils.subtract(listOne, listTwo)); assertEquals(3, differences.size()); assertThat(differences).containsExactly("Tom", "John", "Jack");
“在Java中怎么查找兩個(gè)列表之間的差異”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。