私はファイルを圧縮するプログラムを実行しています (これは ArrayList の Byte として表されます)。ある時点で、定義済みの「文字列」のすべての出現箇所を単一のバイト (「文字列」を一連のバイトとして) に置き換える必要があります。 、Java 言語の String ではありません)。
Byte の ArrayList 型の「定義済み文字列」は変数 opt_word に格納され、その長さは変数 opt_length に格納され、常に >=2 です
「HERE」と記された場所で同時変更例外が発生しています。さらにデバッグすると、最初の置換の直後のループ反復で例外が発生することがわかりました。
hereやhereのような同様の問題について他の人が尋ねたことは知っていますが、私のケースは彼らのケースとはかなり異なります。標準の 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);
}