在 Java 中從 ArrayList 獲取唯一值
一、概述
我們知道在 Java 中ArrayList可以包含重複的值。
在本快速教程中,我們將探討一些在 Java 中從ArrayList獲取唯一值的技術。
二、問題簡介
有時,我們需要從ArrayList中提取唯一值——例如,以增強數據分析、提高效率或簡化進一步處理。
假設我們有一個包含一些操作系統名稱的列表:
List<String> MY_LIST = Arrays.asList(new String[]{
"Microsoft Windows",
"Mac OS",
"GNU Linux",
"Free BSD",
"GNU Linux",
"Mac OS"});
在上面的代碼中,我們從Array初始化了MY_LIST ArrayList 。我們的目標是從MY_LIST中獲取唯一操作系統名稱的列表。
我們將討論解決問題的兩種不同方法。因此,為簡單起見,我們將使用單元測試和 AssertJ 斷言來驗證每種方法是否產生預期結果。
接下來,讓我們看看它們的實際效果。
3.使用Set消除重複元素
Set和List接口之間的一個重要區別是**Set**不能包含重複的元素。因此,要獲得MY_LIST的獨特元素,我們可以先將MY_LIST轉換為Set ,然後再將Set轉換回List 。
讓我們創建一個測試,看看它是如何工作的:
List<String> result = new ArrayList<>(new HashSet<>(MY_LIST));
assertThat(result).containsExactlyInAnyOrder("Free BSD", "Microsoft Windows", "Mac OS", "GNU Linux");
眼尖的人可能已經發現我們使用了 AssertJ 的containsExactlyInAnyOrder()方法來進行驗證。這是因為我們將MY_LIST轉換為HashSet ,而**HashSet不維護插入順序**。
當應該保留插入順序時,我們可以將列表轉換為LinkedHashSet :
result = new ArrayList<>(new LinkedHashSet<>(MY_LIST));
assertThat(result).containsExactly("Microsoft Windows", "Mac OS", "GNU Linux", "Free BSD");
正如我們所見,這一次,我們使用了containsExactly()方法來驗證結果。它不僅檢查元素值,還檢查它們的順序。
4. 使用流 API
Stream API 是 Java 8 的一個重要新特性。它允許我們處理一組元素。
要從流中刪除重複項,我們可以簡單地調用distinct()方法:
List<String> result = MY_LIST.stream()
.distinct()
.collect(toList());
assertThat(result).containsExactly("Microsoft Windows", "Mac OS", "GNU Linux", "Free BSD");
當我們運行它時,測試通過了。
值得一提的是, Collectors.toList()始終保留流的原始順序,除非我們將流轉換為無序模式,例如,通過調用unordered()或使用Collectors.toSet()將其轉換為HashSet 。因此,我們使用containsExactly()方法驗證result列表。
5.結論
從列表中獲取唯一值是 Java 開發中的常見需求。在本文中,我們深入研究了解決此問題的兩種方法:
- 將
List轉換為Set,然後將Set轉換回List - 使用 Stream API 的
distinct()功能
通過綜合示例,我們展示瞭如何應用這些技術有效地從列表中提取不同的元素。
此外,我們還討論了維護結果列表中元素順序的方法,使其與原始輸入列表保持一致。
與往常一樣,此處提供的所有代碼片段都可以在 GitHub 上找到。