同時遍歷兩個 ArrayList
一、概述
有時,我們需要將多個列表中的數據連接在一起,將第一個列表中的第一項與第二個列表中的對應項連接起來,依此類推。
在本教程中,我們將學習幾種同時循環訪問兩個ArrayList
集合的方法。我們將研究循環、迭代器、流和第三方實用程序來解決問題。
2. 問題陳述和用例
讓我們舉一個例子,我們有兩個列表,一個包含國家名稱,第二個包含國家的電話代碼。並假設在第二個列表中,任何給定索引處的電話代碼對應於第一個列表中同一索引處的國家/地區名稱。
我們希望將第二個列表中的正確國家代碼與第一個列表中相應的國家/地區名稱相關聯。
Java 中沒有針對此用例的現成現成解決方案。但是,有幾種方法可以實現這一目標。
讓我們首先創建兩個我們將用於處理的List
對象:
List<String> countryName = List.of("USA", "UK", "Germany", "India");
List<String> countryCode = List.of("+1", "+44", "+49", "+91");
在這裡,我們有兩個相同大小的列表,因為每個國家/地區都應該有一個代碼。如果列表的大小不同,我們的解決方案可能不起作用。
我們要處理這兩個列表並為每個國家/地區獲取正確的代碼。我們將測試每個解決方案的預期輸出:
assertThat(processedList)
.containsExactly("USA: +1", "UK: +44", "Germany: +49", "India: +91");
3. 使用for
循環迭代
讓我們從使用for
循環迭代兩個列表的最簡單方法開始:
for (int i = 0; i < countryName.size(); i++) {
String processedData = String.format("%s: %s", countryName.get(i), countryCode.get(i));
processedList.add(processedData);
}
在這裡,我們對具有相同索引的兩個列表中的每一個都使用了get()
- i
- 來配對我們的項目。在循環結束時, processedList
將包含正確的結果。
4. 使用Collection
迭代器進行Iterator
我們還可以使用Collection
接口的iterator()
方法來獲取Iterator
實例。我們將首先獲取兩個列表的Iterator
實例:
Iterator<String> nameIterator = countryName.iterator();
Iterator<String> codeIterator = countryCode.iterator();
我們將使用while
循環來同時管理兩個迭代器:
while (nameIterator.hasNext() && codeIterator.hasNext()) {
String processedData = String.format("%s: %s", nameIterator.next(), codeIterator.next());
processedList.add(processedData);
}
while
循環調用hasNext()
以確保兩個迭代器仍然有值,並且在循環內,我們使用next()
選擇下一對值。
5. 使用StreamUtils
zip()
方法處理
我們可以說我們的目標是將每個列表中的數據相互附加,或者一起處理這對數據。這也稱為壓縮一對集合。各種庫提供了這個過程的實現,我們可以開箱即用。
讓我們使用 Spring 的StreamUtils
庫的zip()
方法並提供一個Lambda
來創建我們的組合值。
5.1.依賴性
首先,我們應該在pom.xml
文件中添加Spring Data 依賴項:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
<version>2.7.5</version>
</dependency>
5.2.執行
我們會將列表流和 lambda 函數傳遞給zip()
方法。 lambda 將具有處理邏輯,我們將使用collect()
方法獲取列表中的所有已處理數據。
List<String> processedList = StreamUtils.zip(
countryName.stream(),
countryCode.stream(),
(name, code) -> String.format("%s: %s", name, code))
.collect(Collectors.toList());
zip()
的輸出是我們收集的Stream
。在輸入列表的兩個Stream
之後,我們作為第三個參數提供的BiFunction
用於創建Stream
的元素,然後我們可以在末尾將這些元素收集到包含正確配對的單個列表中。
我們應該注意到,此方法具有 Java Streams 的所有優點,包括過濾和映射輸入數據、過濾輸出數據以及盡可能少地保留在內存中。
六,結論
在本教程中,我們學習了同時遍歷兩個ArrayList
的不同方法。
與往常一樣,示例的完整源代碼可在 GitHub 上獲得。