我有两个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);
}
}
答案 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中的剩余值。