我正在搜索ArrayList并与2个迭代器进行比较。我将值写入String缓冲区,最终将是XML输出。当我解析值时,我正在检查匹配的itemIds。比赛通常是零件和图纸。一部分可能有很多图纸。对于我的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。我完全理解为什么。 有没有一种方法,而不是尝试删除条目,我可以用一个布尔或其他东西标记它,所以当第一个循环到达列表中的那个条目时,它知道跳过它并转到下一个?
答案 0 :(得分:1)
将要删除的所有元素添加到新列表中。
迭代后,请致电:
coll1.removeAll (coll2);
不使用迭代器和它们的hasNext / next,但是使用Lists,您可以从上到下迭代for循环。删除元素(7)bevore visit element(6)等对我来说从来都不是问题,但我还没有看到它被推荐。
这里有完整的代码
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 !
答案 1 :(得分:0)
最简单的方法可能是创建另一个列表,在其中放置“匹配”条目,然后检查该列表。