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

Java Iterators and Lists - add to 3rd 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 (itr.hasNext() & itr2.hasNext()) 

只要两个都有下一个元素,您就在前进。如果一个更长呢?在较短的一个没有任何元素后,您的 while 将停止。这就是为什么你错过了其中的两个。

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

为了解决这个问题,在你的 while 循环之后,你应该检查哪些迭代器对于 hasNext() 仍然 returns 为真(如果有的话),然后从该迭代器添加项目 - 仅来自那个迭代器 - 到你的 list3.

你程序中的 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);
    }
}

P.S.:除此之外,您应该使用逻辑运算符 "and" 和 "or"(&&||)而不是二进制运算符,如果您只想检查条件而不是实际的二进制数学。大多数时候它们的行为方式相同,但有时它们会产生意想不到的结果。

您的替代方法在 while 中有一个 &,如果您更改它并放置一个 or 并查看 while 中的任何一个是否为空:

     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]

问题出在你的情况:

itr.hasNext() & itr2.hasNext()

当您将 itr 迭代到它的第五个元素时,while 循环就会退出。所以 list2 的最后一个元素没有被迭代。

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

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

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

可以有另一个循环来查看列表 1 中是否有遗留值,然后检查列表 2 中是否有遗留值。