簡體   English   中英

Java迭代器和列表-添加到第3個列表

[英]Java Iterators and Lists - add to 3rd list

我有兩個LinkedList,我想將兩個中的Integeres添加到第三個List中。 我正在嘗試從第一個列表中添加第一個元素,然后從第二個列表中添加第一個元素,依此類推。

我需要最終的輸出是

[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);
   }


}

程序中的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:除此之外,如果您只想檢查條件而不是實際的二進制數學運算,則應該使用邏輯“ and”和“ or”運算符( &&|| )而不是二進制運算符。 在大多數情況下,它們的行為方式相同,但有時可能會產生意想不到的結果。

您的方法Alternate在while中有一個&,如果您更改了它並放了or,並且您在while內部查看,如果其中任何一個為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]
while (itr.hasNext() & itr2.hasNext()) 

只要兩者都有下一個元素,您就可以前進。 如果更長的話怎么辦? 您的一會兒會在較短的一會兒沒有任何元素之后停止。 這就是為什么您缺少其中2個的原因。

只要兩個列表中都有內容,您的while循環就會起作用。 這意味着,如果一個列表包含6個項目,而其他8個項目,則while將運行6次迭代。 當每個列表的第6個元素結束時,較短列表的hasNext()將變為false並且循環將終止。

為了解決這個問題,在while循環之后,您應該檢查hasNext() (如果有)中哪個迭代器仍返回true,然后將該迭代器中的項(僅來自該迭代器)添加到list3

問題在於您的狀況:

itr.hasNext() & itr2.hasNext()

將itr迭代到其第五個元素時,退出while循環。 因此,list2的最后一個元素不會被迭代。

另請注意,您應該使用運算符“ ||” 代替“ |” 和“ &&”而不是“&”。

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

您的代碼使用“&”測試兩個具有更多值的迭代器。 當使用了較短的列表時,程序退出主循環,並且不檢查一個或另一個列表中剩余的值。 僅當兩個列表具有相同數量的條目時,該選項才起作用。

可能有另一個循環來查看列表1中是否有剩余值,然后檢查列表2中是否有剩余值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM