在 Java 中將 int[] 轉換為 HashSet
1. 概述
數組和HashSet
有一個共同的特點——它們都用來存儲元素的集合。然而,它們的底層實現和適用用例有所不同。此外,區別之一是我們可以將原始類型存儲在數組中,但不能存儲在HashSet
中。
在本教程中,我們將學習如何使用多種方法將int[]
轉換為 Java 中的HashSet<Integer>
。
2. 理解場景
讓我們首先用一些元素初始化一個int[]
, arr
:
int[] arr = { 1, 2, 3, 4, 5 };
現在,讓我們在HashSet<Integer>
類型的expected
變量中定義預期結果:
HashSet<Integer> expected = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5));
現在,讓我們看看是否可以使用Arrays.asList()
方法創建一個列表並將其傳遞給 HashSet 的構造函數:
HashSet<Integer> result = new HashSet<>(Arrays.asList(arr));
不幸的是,編譯器不允許這樣做並給我們一個錯誤:
java: incompatible types: cannot infer type arguments for java.util.HashSet<>
reason: inference variable E has incompatible bounds
equality constraints: java.lang.Integer
lower bounds: T,int[]
我們可以看到它未能正確推斷類型。
最後,我們確認這種方法為我們提供了int[]
的HashSet
而不是HashSet<Integer>
:
HashSet<int[]> result = new HashSet<>(Arrays.asList(arr));
assertEquals(1, result.size());
assertNotEquals(expected, result);
值得注意的是,我們在HashSet
中得到了一個int[]
類型的元素。
3. 使用循環
解決此用例的最直接方法是編寫一個for
循環,迭代數組並將每個成員添加到result
HashSet 中:
HashSet<Integer> result = new HashSet<>();
for (int num : arr) {
result.add(num);
}
此外,我們可以通過斷言result
等於expected
HashSet
來驗證我們的方法:
assertEquals(expected, result);
偉大的!它按預期工作。
4. 使用 Java 流
使用 Java 8
或更高版本,我們可以使用流來實現我們的目標。
讓我們使用Arrays.stream()
方法從int
數組創建整數流,並在中間處理後收集HashSet
中的每個整數:
HashSet<Integer> result = Arrays.stream(arr)
.boxed()
.collect(Collectors.toCollection(HashSet::new));
需要注意的是,我們使用了boxed()
方法將int
類型轉換為Integer
類型。
最後,讓我們驗證一下我們的實現:
assertEquals(expected, result);
完美的!它給了我們正確的結果。
5.使用Commons Lang庫
在本節中,我們將學習如何使用 Commons Lang 庫解決我們的用例。
5.1. Maven依賴
讓我們首先在pom.xml
文件中添加[commons-lang3](https://mvnrepository.com/artifact/org.apache.commons/commons-lang3)
工件的依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.13.0</version>
</dependency>
偉大的!我們已經準備好使用這個庫了。
5.2.使用ArrayUtils.toObject()
方法
現在,我們使用ArrayUtils.toObject()
方法將數組從int
類型轉換為Integer
類型。
此外,我們可以將對像類型傳遞給Arrays.asList()
方法並創建HashSet
對象:
HashSet<Integer> result = new HashSet<>(Arrays.asList(ArrayUtils.toObject(arr)));
與之前一樣,通過簡單的測試來獲得對代碼的信心是一個很好的做法:
assertEquals(expected, result);
極好的!看起來我們已經解決了這個問題。
6.使用Guava庫
接下來,讓我們探索如何使用 Guava 庫解決這個問題。
6.1. Maven依賴
在使用庫方法之前,讓我們在項目的pom.xml
文件中添加guava
工件的依賴項:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.2-jre</version>
</dependency>
我們現在已經準備好使用這個庫了。
6.2.使用Ints.asList()
方法
我們可以使用Ints.asList()
方法獲取包含int
數組中所有成員的Integer
列表。因此,在此方法中我們不需要Arrays.asList()
方法。
因此,讓我們繼續通過傳遞Integer
類型列表來創建結果HashSet
:
HashSet<Integer> result = new HashSet<>(Ints.asList(arr));
此外,我們不要忘記測試我們的方法:
assertEquals(expected, result);
它按預期工作。
七、結論
在本文中,我們學習瞭如何將int[]
轉換為HashSet
集合以改進數據處理。
一方面,我們使用本機方法(例如循環構造和 Java 流)來解決用例。另一方面,我們還探索了 Apache Commons Lang 和 Google Guava 等流行庫來解決這個問題。
與往常一樣,本教程的完整源代碼可在 GitHub 上獲取。