これは直感に反していますが、これは私がこの操作を大幅に高速化した方法です。
まさに私がやっていたこと:
ArrayList < HashMap < String , String >> results; // This has been filled with a whole bunch of results
ArrayList < HashMap < 文字列 , 文字列 > > 破棄 = findResultsToDiscard(results);
results.removeall(破棄);
ただし、remove all メソッドは、2000 の配列 (ish) から約 800 の結果を削除するのに 6 秒以上 (破棄結果を取得するメソッドを含まない) を要していました。
この投稿で gustafc などによって提案された反復子メソッドを試しました。
これにより、操作がわずかに (約 4 秒まで) 高速化されましたが、それでも十分ではありませんでした。危険なことをやってみた…
ArrayList < HashMap < String, String>> results;
List < Integer > noIndex = getTheDiscardedIndexs(results);
for (int j = noIndex.size()-1; j >= 0; j-- ){
results.remove(noIndex.get(j).intValue());
}
一方、getTheDiscardedIndexs は、HashMap の配列ではなく、インデックスの配列を保存します。これにより、オブジェクトの削除がはるかに高速になり (現在は約 0.1 秒)、削除する結果の大きな配列を作成する必要がないため、メモリ効率が向上します。
これが誰かに役立つことを願っています。