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

时间:2015-03-13 15:16:57

标签: java list iterator add

我有两个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);
   }


}

6 个答案:

答案 0 :(得分: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:除此之外,你应该使用逻辑“和”和“或”运算符(&&||)而不是二进制运算符,如果你只想检查条件而不是实际二进制数学。大多数时候他们的行为方式相同,但有时会产生意想不到的结果。

答案 1 :(得分:3)

你的方法备选有一个&amp;在这段时间里,如果你改变了它并且你放了一个或者你在里面看,如果其中任何一个是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]

答案 2 :(得分:0)

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

只要两者都有下一个元素,你就会前进。如果一个更长的话怎么办?在较短的一个没有剩余任何元素之后,你的同时会停止。这就是为什么你错过了其中的两个。

答案 3 :(得分:0)

只要两个列表中都有内容,您的while循环就会起作用。这意味着如果一个列表有6个项目而另外8个项目,while将运行6次迭代。当它完成每个列表的第6个元素时,较短的列表hasNext()将变为false,并且您的循环将终止。

要解决这个问题,在while循环之后,你应该检查哪个迭代器仍为hasNext()(如果有的话)返回true,然后将迭代器中的项目 - 仅从迭代器中添加到你的{ {1}}。

答案 4 :(得分:0)

问题在于你的情况:

itr.hasNext() & itr2.hasNext()

当你将itr迭代到它的第五个元素时,然后while循环退出。因此,list2的最后一个元素不会被迭代。

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

答案 5 :(得分:0)

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

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

可能有另一个循环来查看列表1中是否有剩余值,然后检查列表2中的剩余值。