![](/img/trans.png)
[英]Filter Objects from two lists and do subtract with the attributes and store it in 3rd list in Java 8
[英]Java Iterators and Lists - add to 3rd list
我有兩個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);
}
}
程序中的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:除此之外,如果您只想檢查條件而不是實際的二進制數學運算,則應該使用邏輯“ and”和“ or”運算符( &&
和||
)而不是二進制運算符。 在大多數情況下,它們的行為方式相同,但有時可能會產生意想不到的結果。
您的方法Alternate在while中有一個&,如果您更改了它並放了or,並且您在while內部查看,如果其中任何一個為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]
while (itr.hasNext() & itr2.hasNext())
只要兩者都有下一個元素,您就可以前進。 如果更長的話怎么辦? 您的一會兒會在較短的一會兒沒有任何元素之后停止。 這就是為什么您缺少其中2個的原因。
只要兩個列表中都有內容,您的while
循環就會起作用。 這意味着,如果一個列表包含6個項目,而其他8個項目,則while
將運行6次迭代。 當每個列表的第6個元素結束時,較短列表的hasNext()
將變為false
並且循環將終止。
為了解決這個問題,在while循環之后,您應該檢查hasNext()
(如果有)中哪個迭代器仍返回true,然后將該迭代器中的項(僅來自該迭代器)添加到list3
。
問題在於您的狀況:
itr.hasNext() & itr2.hasNext()
將itr迭代到其第五個元素時,退出while循環。 因此,list2的最后一個元素不會被迭代。
另請注意,您應該使用運算符“ ||” 代替“ |” 和“ &&”而不是“&”。
一個列表中有5個條目,第二個列表中有7個條目。
您的代碼使用“&”測試兩個具有更多值的迭代器。 當使用了較短的列表時,程序退出主循環,並且不檢查一個或另一個列表中剩余的值。 僅當兩個列表具有相同數量的條目時,該選項才起作用。
您可能有另一個循環來查看列表1中是否有剩余值,然后檢查列表2中是否有剩余值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.