0

我正在搜索 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。我完全理解为什么。有没有一种方法可以代替尝试删除条目,而可以用布尔值或其他东西标记它,所以当第一个循环到达列表中的那个条目时,它知道跳过它并转到下一个?

4

2 回答 2

1

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

迭代后,调用:

coll1.removeAll (coll2);

不是使用迭代器及其 hasNext/next,而是使用 Lists,您可以使用 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 ! 
于 2012-05-01T20:08:50.997 回答
0

最简单的方法可能是创建另一个列表,在其中放置“匹配”条目,然后检查该列表。

于 2012-05-01T20:00:07.393 回答