gpt4 book ai didi

Java - 使用 2 个迭代器解析 ArrayList 和可怕的 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-01 15:24:16 28 4
gpt4 key购买 nike

我正在搜索 ArrayList 并与 2 个迭代器进行比较。我正在将值写入字符串缓冲区,该缓冲区最终将成为 XML 输出。当我解析这些值时,我正在检查匹配的 itemId。匹配通常是零件和图纸。一个零件可以有很多张图纸。对于我的 XML,我必须知道所有匹配项的类型和名称,并将这些值附加在一起。

使用这个ArrayList:

itemId 类型名称

1000件锤子
1001零件钉
1000 个 dwg 语义
1002零件尺

我的示例 XML 输出大致如下:

<Master itemId=1000 type=part name=hammer>
<Extra type=dwg name=semantic>
</Master>
<Master itemId=1001 type=part name=nail>
</Master>
<Master itemId=1002 type=part name=ruler>
</Master>

这是我的第一个循环

while (theBaseInterator.hasNext()){
ImportedTableObjects next = theBaseInterator.next();
currentEntry = next.identiferId;
currentType = next.typeId;
currentDatasetName = next.nameId;
compareInterator = tArray.listIterator(theBaseInterator.nextIndex());
compareEntriesofArray(currentEntry, currentType, currentDatasetName, compareInterator); <======= calling method for 2nd loop and compare check
}

我为第二个循环编写了一个方法并进行比较

private void compareEntriesofArray(Object currentEntry, Object currentType, Object currentDatasetName, ListIterator<ImportedTableObjects> compareInterator)
object nextEntry;
while (compareInterator.hasNext()) {
ImportedTableObjects next = compareInterator.next();
nextEntry = next.identiferId;
if(nextEntry.equals(currentEntry)) {
compareInterator.remove();
}

当它找到匹配项时,我尝试从列表中删除匹配的条目。无需重新检查已匹配的条目。因此,当第一个循环继续沿着列表向下时 - 它不必再次检查该条目。

但是我当然得到了 ConcurrentModificationException。我完全理解为什么。有没有一种方法可以让我不用尝试删除该条目,而是可以用 boolean 值或其他东西来标记它,这样当第一个循环到达列表中的该条目时,它就知道跳过它并转到下一个条目? p>

最佳答案

将要删除的所有元素添加到新列表中。

迭代后调用:

coll1.removeAll (coll2);

不是使用迭代器及其 hasNext/next,而是使用列表,您可以使用 for 循环从上到下进行迭代。在访问元素 (6) 之前删除元素 (7) 等等对我来说从来都不是问题,但我还没有看到有人推荐它。

这里是完整的代码

import java.util.*;

public class GuessGame
{
public static void main ( String [] args )
{
char [] ca = "This is a test!".toCharArray ();
List <Character> ls = new ArrayList <Character> ();
for (char c: ca)
ls.add (c);

show (ls);
// first method: remove from top/end and step backwise:
for (int i = ls.size () - 1; i >= 0; --i)
{
char c = ls.get (i);
if (c == 'i' || c == 'a' || c == 'e')
ls.remove (i);
}
show (ls);

// second approach: collect elements to remove ...
ls = new ArrayList <Character> ();
for (char c: ca)
ls.add (c);
show (ls);
// ... in a separate list and
List <Character> toRemove = new ArrayList <Character> ();
for (char c: ls)
{
if (c == 'i' || c == 'a' || c == 'e')
toRemove.add (c);
}
// ... remove them all in one go:
ls.removeAll (toRemove);
show (ls);
}

private static void show (List <Character> ls)
{
for (char c: ls)
System.out.print (c + " ");
System.out.println ();
}
}

输出:

T h i s   i s   a   t e s t ! 
T h s s t s t !
T h i s i s a t e s t !
T h s s t s t !

关于Java - 使用 2 个迭代器解析 ArrayList 和可怕的 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10403476/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com