У меня есть довольно большой список названных элементов ( >= 1,000,000 элементов) и некоторое условие, обозначенное символом <cond> который выбирает элементы, подлежащие удалению, и <cond> верно для многих (возможно, половины) элементов в моем списке.
Моя цель - эффективно удалять элементы, выбранные с помощью <cond> и сохранить все остальные элементы, список источников может быть изменен, может быть создан новый список - лучший способ сделать это должен быть выбран с учетом производительности.
Вот мой тестовый код:
System.out.println("preparing items");
List<Integer> items = new ArrayList<Integer>(); // Integer is for demo
for (int i = 0; i < 1000000; i++) {
items.add(i * 3); // just for demo
}
System.out.println("deleting items");
long startMillis = System.currentTimeMillis();
items = removeMany(items);
long endMillis = System.currentTimeMillis();
System.out.println("after remove: items.size=" + items.size() +
" and it took " + (endMillis - startMillis) + " milli(s)");
и наивная реализация:
public static <T> List<T> removeMany(List<T> items) {
int i = 0;
Iterator<T> iter = items.iterator();
while (iter.hasNext()) {
T item = iter.next();
// <cond> goes here
if (/*<cond>: */i % 2 == 0) {
iter.remove();
}
i++;
}
return items;
}
Как вы можете видеть, я использовал индекс элемента modulo 2 == 0 как условие удаления (<cond> ) - только для демонстрации.
Какая может быть лучшая версия removeMany
и почему эта лучшая версия на самом деле лучше?