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