Java迭代器和列表-添加到第三个列表

Java迭代器和列表-添加到第三个列表,java,list,iterator,add,Java,List,Iterator,Add,我有两个LinkedList,我想将两者中的整数添加到第三个列表中。我试图添加第一个列表中的第一个元素,然后添加第二个列表中的第一个元素,以此类推 我需要最终的输出 [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.L

我有两个LinkedList,我想将两者中的整数添加到第三个列表中。我试图添加第一个列表中的第一个元素,然后添加第二个列表中的第一个元素,以此类推

我需要最终的输出

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


}
导入java.util.array;
导入java.util.Iterator;
导入java.util.LinkedList;
导入java.util.List;
公共类Ex11_2_备用{
公共静态void main(字符串[]args){
列表=新建LinkedList();
List list2=新链接列表();
addAll(Arrays.asList(1,2,3,4,5));
list2.addAll(Arrays.asList(6,7,8,9,10,11,12));
候补(名单,清单2);
}
专用静态无效备用(列表列表,列表2){
List list3=新链接列表();
迭代器itr=list.Iterator();
迭代器itr2=list2.Iterator();
while(itr.hasNext()&itr2.hasNext()){
int元素=itr.next();
int element2=itr2.next();
如果((元素|元素2)!=0){
清单3.添加(元素);
清单3.添加(元素2);
}
}
System.out.println(“在…之后:”+list3);
}
}

只要双方都有下一个元素,你就可以前进。如果一个更长呢?在较短的while没有任何剩余元素后,您的while将停止。这就是您缺少其中两个的原因。

只要两个列表中都有内容,您的
循环就可以工作。这意味着,如果一个列表有6个项目,其他8个项目,则
while
将运行6次迭代。当每个列表的第6个元素结束时,较短列表的
hasNext()
将变为
false
,循环将终止


要解决这个问题,在while循环之后,您应该检查哪个迭代器对于
hasNext()
(如果有)仍然返回true,然后将该迭代器中的项(仅来自该迭代器)添加到
列表3

程序中的while循环的工作方式与您认为的不一样

当所有操作数均为
true
时,
&
将计算为
true
。这意味着,在本例中,while循环将一直运行,直到两个迭代器中的一个没有下一个元素为止!由于您的一个列表比另一个短,这意味着并非第二个列表中的所有内容都将添加到第三个列表中

如果将“and”替换为“or”(
|
),则会出现异常。现在,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);
    }
}

注意:除此之外,如果您只想检查条件而不是实际的二进制数学,则应该使用逻辑“and”和“and”或“or”运算符(
&&
|
)而不是二进制运算符。大多数情况下,它们的行为方式是相同的,但有时可能会产生意外的结果。

如果您更改它并放置or,然后查看其中的while,如果其中任何一个为null,则您的方法备选方法在while中有一个(&I):

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

问题在于您的状况:

itr.hasNext() & itr2.hasNext()
当您将itr迭代到它的第五个元素时,while循环退出。因此,list2的最后一个元素不会被迭代


还请注意,您应该使用运算符“| |”而不是“|”和“&&”而不是“&”。

一个列表中有5个条目,第二个列表中有7个条目

使用“&”对具有更多值的两个迭代器进行代码测试。当使用较短的列表时,程序将退出主循环,并且不会检查一个列表或另一个列表中的剩余值。只有当两个列表的条目数相同时,它才起作用


您可以使用另一个循环查看列表1中是否有剩余值,然后检查列表2中是否有剩余值

太棒了。这对我很管用。我就是不明白它是怎么工作的。我们有两个while循环。我可以理解它将整数添加到列表3中,但我无法理解它是如何以正确的顺序进行操作的。因为,在第一个while循环中,它会将列表中的所有值添加到列表3。。。完成此操作后,它将移动到第二个while循环,在该循环中,它将在列表中的所有值之后向列表3添加值。我不明白它是如何在两个while循环之间跳转的。我编辑了我的答案,以使这些值可以交替,因为我在第一次阅读您的问题时忽略了这一要求。有了这个while循环,它现在应该可以工作了。啊,我明白了。。我明白:)谢谢你的帮助;)
After: [1, 6, 2, 7, 3, 8, 4, 9, 5, 10, 11, 12]
itr.hasNext() & itr2.hasNext()