日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何查找兩個列表之間的差異?

1. 概述

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供承留網(wǎng)站建設(shè)、承留做網(wǎng)站、承留網(wǎng)站設(shè)計、承留網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、承留企業(yè)網(wǎng)站模板建站服務(wù),10年承留做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

查找相同數(shù)據(jù)類型的對象集合之間的差異是一項常見的編程任務(wù)。舉個例子,假設(shè)我們有一份申請考試的學(xué)生名單和另一份通過考試的學(xué)生名單。這兩張名單的區(qū)別會告訴我們那些沒有通過考試的學(xué)生。

在Java中,List API 中沒有顯式的方法來查找兩個列表之間的差異,盡管有一些helper方法非常接近。

在本篇文章中,我們將了解如何找出兩個列表之間的差異。我們將嘗試幾種不同的方法,包括普通的Java(有和沒有Streams),以及使用第三方庫,如Guava和Apache Commons Collections。

2. 測試設(shè)置

首先定義兩個列表,我們將用它們來測試示例:

 
 
 
 
  1. public class FindDifferencesBetweenListsUnitTest {
  2.  
  3.     private static final List listOne = Arrays.asList("Jack", "Tom", "Sam", "John", "James", "Jack");
  4.     private static final List listTwo = Arrays.asList("Jack", "Daniel", "Sam", "Alan", "James", "George");
  5.  
  6. }

3. 使用 Java List API

我們可以創(chuàng)建一個列表的副本,然后使用List 的方法removeAll() ,刪除與另一個相同的所有元素:

 
 
 
 
  1. List differences = new ArrayList<>(listOne);
  2. differences.removeAll(listTwo);
  3. assertEquals(2, differences.size());
  4. assertThat(differences).containsExactly("Tom", "John");

讓我們把這個顛倒過來,從另一個角度找出差異:

 
 
 
 
  1. List differences = new ArrayList<>(listTwo);
  2. differences.removeAll(listOne);
  3. assertEquals(3, differences.size());
  4. assertThat(differences).containsExactly("Daniel", "Alan", "George");

我們還應(yīng)該注意到,如果我們想找到兩個列表之間的公共元素,List 還有一個 retainal 方法。

4. 使用 Streams API

Java Stream API 可用于對集合中的數(shù)據(jù)執(zhí)行順序操作,包括過濾列表之間的差異:

 
 
 
 
  1. List differences = listOne.stream()
  2.             .filter(element -> !listTwo.contains(element))
  3.             .collect(Collectors.toList());
  4. assertEquals(2, differences.size());
  5. assertThat(differences).containsExactly("Tom", "John");

與第一個示例一樣,我們可以切換列表的順序,以從第二個列表中找到不同的元素:

 
 
 
 
  1. List differences = listTwo.stream()
  2.             .filter(element -> !listOne.contains(element))
  3.             .collect(Collectors.toList());
  4. assertEquals(3, differences.size());
  5. assertThat(differences).containsExactly("Daniel", "Alan", "George");

注意 List.contains() 對于較大的列表來說,可能是一項成本高昂的操作。

5. 使用第三方庫

5.1. 使用Google Guava

Guava 包含 Sets.difference 方法, 但要使用它,我們需要先將列表轉(zhuǎn)換為集合:

 
 
 
 
  1. List differences = new ArrayList<>(Sets.difference(Sets.newHashSet(listOne), Sets.newHashSet(listTwo)));
  2. assertEquals(2, differences.size());
  3. assertThat(differences).containsExactlyInAnyOrder("Tom", "John");

注意,將 列表 轉(zhuǎn)換為 集合 會產(chǎn)生重復(fù)數(shù)據(jù)消除和重新排序的效果。

5.2. 使用 Apache Commons Collections

Apache Commons Collections中的 CollectionUtils 包含 removeAll 方法.

該方法類似于List.removeAll(),同時也為結(jié)果創(chuàng)建一個新的集合:

 
 
 
 
  1. List differences = new ArrayList<>((CollectionUtils.removeAll(listOne, listTwo)));
  2. assertEquals(2, differences.size());
  3. assertThat(differences).containsExactly("Tom", "John");

6. 處理重復(fù)值

現(xiàn)在讓我們看看當(dāng)兩個列表包含重復(fù)值時的差異。

為了實(shí)現(xiàn)這一點(diǎn),我們需要從第一個列表中刪除重復(fù)的元素,精確到它們包含在第二個列表中的次數(shù)

在我們的示例中,“Jack”值在第一個列表中出現(xiàn)兩次,在第二個列表中僅出現(xiàn)一次:

 
 
 
 
  1. List differences = new ArrayList<>(listOne);
  2. listTwo.forEach(differences::remove);
  3. assertThat(differences).containsExactly("Tom", "John", "Jack");

我們也可以使用Apache Commons Collections中的subtract方法來實(shí)現(xiàn):

 
 
 
 
  1. List differences = new ArrayList<>(CollectionUtils.subtract(listOne, listTwo));
  2. assertEquals(3, differences.size());
  3. assertThat(differences).containsExactly("Tom", "John", "Jack");

7. 結(jié)論

在本文中,我們探討了幾種查找列表之間差異的方法。

在這些示例中,我們介紹了一個基本的Java解決方案,一個使用StreamsAPI的解決方案,以及Google Guava和Apache Commons Collections等第三方庫,以及了解了如何處理重復(fù)值。

本文轉(zhuǎn)載自微信公眾號「鍋外的大佬」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系鍋外的大佬公眾號。


分享標(biāo)題:如何查找兩個列表之間的差異?
文章地址:http://www.5511xx.com/article/dheohoj.html