在 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 上找到。