成人免费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

2011-08-29 18:17:58

Ubuntu

2023-12-20 22:04:17

Linux二進制文件

2022-06-17 09:46:51

Chrome 102Chrome瀏覽器

2009-07-15 18:29:22

Jython應用

2021-12-01 07:31:50

Java文件校驗

2021-05-07 08:03:05

JS動態合并

2010-07-02 12:26:51

LEACH協議

2021-01-11 16:30:40

SQL數據庫函數

2017-04-10 14:35:35

SambaRsyncSysVol

2021-10-13 06:49:13

Integer 阿里巴巴包裝類

2020-11-13 07:16:09

線程互斥鎖死循環

2022-02-27 13:16:09

漏洞網絡安全

2014-05-29 17:03:05

UnixLinux管理員

2014-09-11 17:02:41

綜合布線

2010-07-25 14:31:54

Telnet程序
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 狠狠操天天操 | 欧美性区 | 欧美在线观看一区 | 欧美 日韩 综合 | 国产精品久久 | 黄色大片在线视频 | 超碰男人天堂 | 日韩欧美精品在线播放 | 欧美激情精品久久久久 | 欧美性久久 | 第四色播日韩第一页 | 国产视频一区二区 | 精品视频999 | 成av在线| 亚洲国产精品一区在线观看 | 精品视频网 | 美日韩精品 | 亚洲一区二区三区久久久 | 欧美激情视频网站 | 天天干天天草 | 97在线观看 | 国产一区免费视频 | 午夜国产精品视频 | 色网在线看 | 91精品久久久久久久久久入口 | 亚洲精品一区二区 | 国产一区 在线视频 | 91高清免费观看 | 三级成人在线观看 | 国产激情在线观看视频 | 亚洲精品2区 | 欧美精品一区在线发布 | 玖操| 伊人国产精品 | 国产高清性xxxxxxxx | 日韩成人精品一区二区三区 | 亚洲视频一区 | 91视在线国内在线播放酒店 | 欧美精品一区二区三区在线播放 | 亚洲欧美一区二区三区国产精品 | 91偷拍精品一区二区三区 |