2015-03-13 72 views
2

我有兩個LinkedList,我想將兩個Integeres添加到第三個列表中。我想第一個元素從第一個列表從第二個列表等Java迭代器和列表 - 添加到第三個列表

我需要的最終輸出是

[1, 6, 2, 7, 3, 8, 4, 9, 5, 10, 11, 12]. 

添加,那麼第一個元素,但我不斷收到

[1, 6, 2, 7, 3, 8, 4, 9, 5, 10]. 

我該如何解決?

這裏是我的代碼:

import java.util.Arrays; 
import java.util.Iterator; 
import java.util.LinkedList; 
import java.util.List; 
public class Ex11_2_alternate { 

public static void main(String[] args) { 

    List<Integer> list = new LinkedList<>(); 
    List<Integer> list2 = new LinkedList<>(); 

    list.addAll(Arrays.asList(1,2,3,4,5)); 
    list2.addAll(Arrays.asList(6,7,8,9,10,11,12)); 

    alternate(list,list2); 

} 
private static void alternate(List<Integer> list, List<Integer> list2) { 

    List<Integer> list3 = new LinkedList<>(); 

    Iterator<Integer> itr = list.iterator(); 
    Iterator<Integer> itr2 = list2.iterator(); 

    while (itr.hasNext() & itr2.hasNext()) { 
     int element = itr.next(); 
     int element2 = itr2.next(); 

     if ((element | element2) != 0) { 
      list3.add(element); 
      list3.add(element2); 
     } 


     } 
    System.out.println("After ... : " + list3); 
    } 


} 

回答

3

程序中的while循環不會按照您認爲的方式工作。當所有操作數是true時,將評估爲true。這意味着,在這種情況下,您的while循環將運行,直到兩個迭代器中的一個沒有下一個元素!由於你的列表中的一個比另一個短,這意味着第二個列表中的所有內容都不會添加到第三個列表中!

如果用「或」(||)替換「和」,雖然會發生異常。現在,您的while循環嘗試運行,直到兩個列表都不在元素中。其中一個將在另一個之前耗盡,所以你試圖從更短的列表中獲得比實際更多的元素!

爲了解決這個問題,你必須檢查是否有再次循環內多個元素:

while(itr.hasNext() || itr2.hasNext()) { 
    if(itr.hasNext()) { 
     int element = itr.next(); 
     list3.add(element); 
    } 
    if(itr2.hasNext()) { 
     int element = itr2.next(); 
     list3.add(element); 
    } 
} 

PS:除此之外,你應該使用邏輯「與」和「或」運算符(&&||)而不是二進制的,如果你只是想檢查條件而不是實際的二進制數學。大多數時候他們的行爲方式都是一樣的,但有時他們會產生意想不到的結果。

+0

真棒檢查遺留的值。這對我有效。 我只是不明白它是如何工作的。我們有兩個while循環。 我可以理解,它將整數添加到list3中 - 但我無法保持它是如何按正確順序執行的。 因爲,在第一個while循環中,它會將list中的所有值添加到list3中......當它完成時,它將移動到第二個while循環,它會將值添加到list3後的所有值名單。 無法理解它如何在兩個while循環之間跳轉。 – 2015-03-13 15:35:25

+0

我編輯了我的答案,以便值會交替出現,因爲我在第一次閱讀您的問題時錯過了這個要求。有了這個while while循環,它現在應該可以工作。 – mhlz 2015-03-13 15:36:25

+0

啊,我明白了......而且我明白了:) 感謝您的幫助;) – 2015-03-13 15:41:06

0
while (itr.hasNext() & itr2.hasNext()) 

你在前進,只要有下一個元素。如果一個更長,會怎樣?在較短的一個沒有任何元素後,你的一段時間將停止。這就是爲什麼你錯過了其中2個。

0

你的while循環工作,只要有這兩個列表中的東西。這意味着如果一個列表包含6個項目和其他8個項目,則while將運行6次。當它完成每個列表的第六個元素時,較短的列表hasNext()將變爲false,並且您的循環將終止。

爲了解決這個問題,你的while循環後,應檢查其迭代器仍然hasNext()返回true(如果有的話),然後從該迭代器添加的項目 - 只從迭代器 - 您list3

3

你的方法替代已在同時的&,如果你改變它,你把一個或和你的外表,而裏面如果有任何爲null:

 private static void alternate (List<Integer> list, List<Integer> list2) { 

     List<Integer> list3 = new LinkedList<>(); 

     Iterator<Integer> itr = list.iterator(); 
     Iterator<Integer> itr2 = list2.iterator(); 

     while (itr.hasNext() || itr2.hasNext()) { 
      if (itr.hasNext()) { 
       int element = itr.next(); 
       list3.add(element); 
      } 
      if (itr2.hasNext()) { 
       int element2 = itr2.next(); 
       list3.add(element2); 
      } 
     } 
     System.out.println("After: " + list3); 
    } 

結果是:

After: [1, 6, 2, 7, 3, 8, 4, 9, 5, 10, 11, 12] 
+0

它看起來很簡單,但它的工作原理。謝謝,大衛:) – 2015-03-13 15:38:15

0

問題出在你的病情:

itr.hasNext() & itr2.hasNext() 

當你迭代itr到第五個元素,然後while循環退出。所以list2的最後一個元素不會被迭代。

還要注意,你應該使用運算符「||」代替「|」和「& &」而不是「&」。

0

您在一個列表中有5個條目,第二個列表中有7個條目。

您的代碼使用「&」針對具有更多值的迭代器進行測試。當較短的列表被使用時,程序退出主循環,並且它不檢查一個列表或另一個列表中剩餘的值。它只適用於兩個列表具有相同數量的條目。

可能有另一種循環,看看是否有列表1中遺留的值,然後在列表2