成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何查找兩個列表之間的差異?

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

 [[337754]]

1. 概述

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

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

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

2. 測試設置

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

  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.   

3. 使用 Java List API

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

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

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

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

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

4. 使用 Streams API

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

  1. List<String> 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<String> 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 方法, 但要使用它,我們需要先將列表轉換為集合:

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

注意,將 列表 轉換為 集合 會產生重復數據消除和重新排序的效果。

5.2. 使用 Apache Commons Collections

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

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

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

6. 處理重復值

現在讓我們看看當兩個列表包含重復值時的差異。

為了實現這一點,我們需要從第一個列表中刪除重復的元素,精確到它們包含在第二個列表中的次數

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

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

我們也可以使用Apache Commons Collections中的subtract方法來實現:

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

7. 結論

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

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

本文轉載自微信公眾號「鍋外的大佬」,可以通過以下二維碼關注。轉載本文請聯系鍋外的大佬公眾號。

 

責任編輯:武曉燕 來源: 鍋外的大佬
相關推薦

2021-03-19 11:05:50

Linux目錄命令

2021-12-16 16:20:57

GoWebSocketLinux

2011-04-15 09:47:38

IntentActivityAndroid

2019-08-20 16:23:54

數據安全服務器IT

2010-08-17 15:52:59

FirefoxIEJavaScript

2023-12-20 22:04:17

Linux二進制文件

2011-08-29 18:17:58

Ubuntu

2021-05-07 08:03:05

JS動態合并

2021-12-01 07:31:50

Java文件校驗

2010-07-02 12:26:51

LEACH協議

2009-07-15 18:29:22

Jython應用

2022-06-17 09:46:51

Chrome 102Chrome瀏覽器

2017-04-10 14:35:35

SambaRsyncSysVol

2021-01-11 16:30:40

SQL數據庫函數

2021-10-13 06:49:13

Integer 阿里巴巴包裝類

2020-11-13 07:16:09

線程互斥鎖死循環

2022-02-27 13:16:09

漏洞網絡安全

2025-06-10 07:09:00

2023-03-31 07:31:28

SliceGolang

2014-05-29 17:03:05

UnixLinux管理員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频一区二区三区 | 成人黄色电影在线观看 | 亚洲精品一区二三区不卡 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 在线视频成人 | 亚洲天堂一区二区 | 三级视频在线观看 | 亚洲成人三区 | 久久综合99| 精品中文字幕在线观看 | 欧美国产精品一区二区三区 | www.日本在线观看 | 久草在线 | 天天操天天摸天天干 | 午夜一级大片 | av永久| 成人深夜福利 | 在线日韩 | 欧美黑人一区二区三区 | 国产人成精品一区二区三 | 亚洲九色 | 欧洲毛片 | 99婷婷 | 欧美日韩高清 | 亚洲一区视频在线 | 亚洲综合色站 | 99精品免费 | 日韩和的一区二在线 | 亚洲一区二区在线 | 久久精品视频在线播放 | 精品在线一区 | 欧美freesex黑人又粗又大 | 国产成人精品免高潮在线观看 | 欧美精品一| 中文字幕在线第二页 | 欧产日产国产精品视频 | .国产精品成人自产拍在线观看6 | 91精品国模一区二区三区 | 福利视频一区二区 | 国产精品欧美一区喷水 | 天天射影院 |