2017-07-18 43 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