Java-迭代两个列表,比较,然后添加到另一个列表

Java-迭代两个列表,比较,然后添加到另一个列表,java,list,iterator,Java,List,Iterator,我有三个列表:listA,listB,listC listA listB 1,a,tf b,true 2,b,tf a,false 3,c,tf c,true 我想让listC成为listA+listB,顺序是listA(将listA的tf替换为listB的true/false) 这是我的密码 Iterator a= listA.iterator(); Iterator b= listB.iterator(); while(a.hasN

我有三个列表:
listA
listB
listC

listA        listB
1,a,tf       b,true
2,b,tf       a,false
3,c,tf       c,true
我想让
listC
成为
listA
+
listB
,顺序是
listA
(将
listA
tf
替换为
listB
true
/
false

这是我的密码

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,使用单独的迭代器进行拆分和索引,效果很好,但是当我运行上面的代码时,程序就冻结了。有什么想法吗?

你真的不远了。迭代器可能会令人困惑,因此我倾向于避免使用迭代器

我真的看不出无限循环在代码中的位置-我期望出现
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());
listA=Arrays.asList(“1,a,tf”,“2,b,tf”,“3,c,tf”);
listB=Arrays.asList(“b,true”,“a,false”,“c,true”);
List listC=new ArrayList();
for(字符串a:listA)
{
for(字符串b:listB)
{
if(String.valueOf(a).split(“,”[1])等于(String.valueOf(b).split(“,”[0]))
{
add(String.valueOf(a).replaceAll(“tf”,String.valueOf(b).split(“,”[1]));
}
}
}
System.out.println(listC.toString());

我不确定是否会冻结,但以这种方式使用迭代器很可能不会得到您期望的结果。您应该阅读
hasNext()
next()
应该做什么,因此您可能会意识到,在调用
hasNext()
之后多次调用
next()
(就像您在if语句中对
a
b
所做的那样,并且在b循环中对
a
所做的那样)这不是个好主意。用地图代替列表会让你的生活更轻松。另外,为
1,a,tf
创建自己的类可以帮助您更轻松地创建条件,而不是拆分字符串。如果应用这些更改,您的代码可能看起来像(YourClass yc:listA){yc.setTrueFalse(mapB.get(yc.getName());}。这实际上会更新listA的元素,但是你可以构建你的解决方案,它可以轻松地创建单独的listC。哎呀,我在大学时就这样循环收集,但我现在真的从来没有想到过这一点。每次涉及到集合时,我总是想到迭代器。但是你知道用多个while迭代列表会出什么问题吗?顺便说一句,老兄,我已经死了好几个小时了。这与调用
a.hasNext()
一次然后
a.next()
两次有关。它会在阵法的末端向你开枪。我的直觉说它不应该导致无限循环,而是崩溃,但显然我错了。仅供参考,这种样式的for each与您编写的没有什么不同(除了您的double
a.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());