2013-04-22 239 views
4

例如在Java中,如何同時遍歷兩個列表?

for(String str : list1) { 
... 
} 

for(String str : list2) { 
... 
} 

假設我們確信list1.size()等於list2.size(),如何在一個for聲明遍歷這兩個列表?

也許像for(String str1 : list1, str2 : list2)

+1

當列表長度不同時,您希望發生什麼? – 2013-04-22 19:01:59

回答

4
for(int i = 0; i< list1.size(); i++){ 
    String str1 = list1.get(i); 
    String str2 = list2.get(i); 
    //do stuff 
} 
+0

寧願計數以代替list1.size()並計算爲Math.min(list1.size(),list2.size())的計數以確保安全。 – Aubin 2013-04-22 19:06:04

+0

使用'LinkedList'時不應該使用這個方法。每次迭代'get'方法將從列表的開頭迭代到當前元素,這導致O(n²)漸近性能。在使用鏈表時,強烈建議使用迭代器。 – wardva 2018-01-26 13:12:36

1

使用基本循環

for(int index=0; index < list1.size() ; index++){ 
    list1.get(index); 
    list2.get(index); 
} 
+0

寧願計數以代替list1.size()並將計數計算爲Math.min(list1.size(),list2.size())以確保安全。 – Aubin 2013-04-22 19:07:07

1

你不能在同一時間與增強for循環遍歷兩個列表;你必須通過它與傳統的for循環迭代:

for (int i = 0; i < list1.size(); i++) 
{ 
    String str1 = list1.get(i); 
    String str2 = list2.get(i); 
    ... 
} 
+1

寧願計數以代替list1.size(),並將計數計算爲Math.min(list1.size(),list2.size())以確保安全。 – Aubin 2013-04-22 19:06:40

+0

的確,這是遠離「IndexOutOfBoundsException」的一種好方法,但是OP已經表明,一個先決條件是「我們確定list1.size()'等於'list2.size()'」已經。 – rgettman 2013-04-22 19:08:35

14

您可以使用iterators

Iterator<String> it1 = list1.iterator(); 
Iterator<String> it2 = list2.iterator(); 
while(it1.hasNext() && it2.hasNext()) { .. } 

或者:

for(Iterator<String> it1 = ... it2..; it1.hasNext() && it2.hasNext();) {...} 
+1

我以爲沒有人會遇到Java中的無限集合;) – 2013-04-22 19:02:40

+1

除了OP需要一個for語句之外,這是一個很好的解決方案。 – rgettman 2013-04-22 19:03:47

+5

for(Iterator i1 = one.iterator(),i2 = two.iterator(); i1.hasNext()&& i2.hasNext();){...} – 2013-04-22 19:05:03

0

至於你說的這兩個該列表大小相同,則可以使用「for」循環而不是「for-each」循環。您可以使用列表的get(int index)方法在每次迭代期間獲取該值。

1

如果有人感興趣,即使它們的大小不一樣,這個解決方案也會完全遍歷這兩個列表。

int max = Math.max(list1.size(), list2.size()); 
for(int i=0; i<max; ++i){ 
    if(list1.size()<i){ 
     list1.get(i); 
    } 
    if(list2.size()<i){ 
     list2.get(i); 
    } 
}