0

私はファイルを圧縮するプログラムを実行しています (これは ArrayList の Byte として表されます)。ある時点で、定義済みの「文字列」のすべての出現箇所を単一のバイト (「文字列」を一連のバイトとして) に置き換える必要があります。 、Java 言語の String ではありません)。

Byte の ArrayList 型の「定義済み文字列」は変数 opt_word に格納され、その長さは変数 opt_length に格納され、常に >=2 です

「HERE」と記された場所で同時変更例外が発生しています。さらにデバッグすると、最初の置換の直後のループ反復で例外が発生することがわかりました。

herehereのような同様の問題について他の人が尋ねたことは知っていますが、私のケースは彼らのケースとはかなり異なります。標準の for ループを使用します。

            CopyOnWriteArrayList<Integer> removal_indexes = new CopyOnWriteArrayList<Integer>();
            for(int j=0, l=0; j <= encoded.get(k).size() - opt_length; ++j, ++l)
            {
                List<Byte> str = encoded.get(k).subList(j, j + opt_length);
                if (str.equals(opt_word))  // <-- here
                {
                    removal_indexes.add(l);
                    j += opt_length - 1;
                }
            }

            for(int l=0; l < removal_indexes.size(); ++l)
            {
                encoded.get(k).set(removal_indexes.get(l), (byte)(lowr + lengths.size()));
                for(int i=1; i < opt_length; ++i)
                    encoded.get(k).remove(removal_indexes.get(l)+1);
            }
4

2 に答える 2

3

これは、あなたがリンクした他の人たちと同じ状況です。remove() メソッドは、Arraylist のサイズを変更します。反復処理中に Arraylist のサイズを変更すると、前述の同時変更エラーが発生します。解決策は、他のリストで削除する項目を追跡し、for ループが終了した後にそれらを削除することです。

于 2013-06-30T20:09:33.407 に答える