Несмотря на то, что это противоречит интуиции, я значительно ускорил эту операцию.
Именно то, что я делал:
ArrayList < HashMap < String , String >> results; // This has been filled with a whole bunch of results
ArrayList > discard = findResultsToDiscard (results);
results.removeall (отбрасывания);
Однако метод remove all занимал более 6 секунд (НЕ включая метод получения результатов сброса), чтобы удалить приблизительно 800 результатов из массива 2000 (ish).
Я попробовал метод итератора, предложенный 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 сохраняют массив индексов, а не массив HashMaps. Это ускоряет процесс удаления объектов (примерно на 0,1 секунды) и повышает эффективность использования памяти, так как нам не нужно создавать большой массив результатов для удаления.
Надеюсь, это кому-нибудь поможет.