0

ArrayListを検索し、2つのイテレータと比較しています。最終的にXML出力になる文字列バッファに値を書き込んでいます。値を解析するときに、一致するitemIdを確認しています。マッチは通常、パーツと図面です。パーツには多くの図面が存在する可能性があります。私のXMLでは、すべての一致のタイプと名前を知り、値を一緒に追加する必要があります。

このArrayListの使用:

itemIdタイプ名

1000部ハンマー
1001部釘
1000dwgセマンティック
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
  }

2番目のループのメソッドを作成して比較します

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ではなく、リストを使用すると、forループで上から下に反復できます。要素(7)を削除すると、要素(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 ! 
于 2012-05-01T20:08:50.997 に答える
0

最も簡単な方法は、「一致した」エントリを配置する別のリストを作成し、そのリストと照合することです。

于 2012-05-01T20:00:07.393 に答える