2017-07-18 134 views
1

我有三個列表:listAlistB,listCJava - 重複兩個列表,比較然後添加到另一個列表

listA  listB 
1,a,tf  b,true 
2,b,tf  a,false 
3,c,tf  c,true 

和我想有listClistA + listBlistA順序(替換listAtflistBtrue/false)。

listC 
1,a,false 
2,b,true 
3,c,true 

這裏是我的代碼

Iterator a= listA.iterator(); 
Iterator b= listB.iterator(); 
    while(a.hasNext()){ 
     while(b.hasNext()){ 
      if(String.valueOf(a.next()).split(",")[1].equals(String.valueOf(b.next()).split(",")[0])){ 
        listC.add(String.valueOf(a.next()).replaceAll("tf", String.valueOf(b.next()).split(",")[1])); 
      } 
     } 
    } 

與個別迭代器,而對於和listA的是數組listB分裂和索引,它工作正常,但是當我運行上面的代碼,程序只是凍結。有什麼想法嗎?

+0

我不知道這一點,但凍結使用迭代器的方式將最有可能不會產生你所期待的結果。你應該閱讀'hasNext()'和'next()'是做什麼的,因此你可能會意識到,在調用'hasNext()'之後多次調用'next()'你的if語句中的'a'和'b'以及b循環中的'a')不是一個好主意。 – Thomas

+1

讓Map 代替ListB會讓你的生活更輕鬆。同時爲'1,a,tf'製作自己的班級可以幫助您更輕鬆地創造條件,而不是拆分字符串。如果您應用這些更改,您的代碼可能看起來像for(YourClass yc:listA){yc.setTrueFalse(mapB.get(yc.getName()));}'。這實際上會更新listA的元素,但是您可以構建您的解決方案,從而輕鬆創建單獨的listC。 – Pshemo

回答

1

你真的不遠。迭代器可能會讓人困惑,所以我傾向於避免它們。

我無法真正看到無限循環在你的代碼中的位置 - 我期望NullPointerException,因爲你多次呼叫a.next()b.next()

如果你改變你的代碼刪除迭代器,它工作正常:

List<String> listA = Arrays.asList("1,a,tf", "2,b,tf", "3,c,tf"); 
List<String> listB = Arrays.asList("b,true", "a,false", "c,true"); 
List<String> listC = new ArrayList<>(); 

for(String a : listA) 
{ 
    for (String b : listB) 
    { 
     if (String.valueOf(a).split(",")[1].equals(String.valueOf(b).split(",")[0])) 
     { 
      listC.add(String.valueOf(a).replaceAll("tf", String.valueOf(b).split(",")[1])); 
     } 
    } 
} 

System.out.println(listC.toString()); 
+0

哎呦,當我在大學的時候,我實際上正在循環這些集合,但我現在從來沒有想過這個,真的。每次涉及收集時,我總是在考慮迭代器。但是你知道在多次迭代列表時出了什麼問題嗎? BTW爲你+1,這已經殺了我幾個小時。 whew – Miko

+0

它是通過調用'a.hasNext()'然後'a.next()'兩次來完成的。它會在陣列的最後射擊你。我的直覺表明,它不應該導致無限循環,而是崩潰,但顯然我錯了。僅供參考,這種for-each [實際上確實使用迭代器「引擎蓋下」](https://stackoverflow.com/questions/85190/how-does-the-java-for-each-loop-work),所以它的沒有什麼不同,你寫的(除了你的雙'a.next()'),它看起來更好。 – Michael