2015-03-13 70 views
2

我有两个LinkedList,我想将两个Integeres添加到第三个列表中。我想第一个元素从第一个列表从第二个列表等Java迭代器和列表 - 添加到第三个列表

我需要的最终输出是

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


} 

回答

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

+0

真棒检查遗留的值。这对我有效。 我只是不明白它是如何工作的。我们有两个while循环。 我可以理解,它将整数添加到list3中 - 但我无法保持它是如何按正确顺序执行的。 因为,在第一个while循环中,它会将list中的所有值添加到list3中......当它完成时,它将移动到第二个while循环,它会将值添加到list3后的所有值名单。 无法理解它如何在两个while循环之间跳转。 – 2015-03-13 15:35:25

+0

我编辑了我的答案,以便值会交替出现,因为我在第一次阅读您的问题时错过了这个要求。有了这个while while循环,它现在应该可以工作。 – mhlz 2015-03-13 15:36:25

+0

啊,我明白了......而且我明白了:) 感谢您的帮助;) – 2015-03-13 15:41:06

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

你在前进,只要有下一个元素。如果一个更长,会怎样?在较短的一个没有任何元素后,你的一段时间将停止。这就是为什么你错过了其中2个。

0

你的while循环工作,只要有这两个列表中的东西。这意味着如果一个列表包含6个项目和其他8个项目,则while将运行6次。当它完成每个列表的第六个元素时,较短的列表hasNext()将变为false,并且您的循环将终止。

为了解决这个问题,你的while循环后,应检查其迭代器仍然hasNext()返回true(如果有的话),然后从该迭代器添加的项目 - 只从迭代器 - 您list3

3

你的方法替代已在同时的&,如果你改变它,你把一个或和你的外表,而里面如果有任何为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] 
+0

它看起来很简单,但它的工作原理。谢谢,大卫:) – 2015-03-13 15:38:15

0

问题出在你的病情:

itr.hasNext() & itr2.hasNext() 

当你迭代itr到第五个元素,然后while循环退出。所以list2的最后一个元素不会被迭代。

还要注意,你应该使用运算符“||”代替“|”和“& &”而不是“&”。

0

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

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

可能有另一种循环,看看是否有列表1中遗留的值,然后在列表2