Теперь проблема, с которой я столкнулся, заключается в том, что эта часть кода значительно замедляется, как только в списке появляются объекты более чем 10000. Я понимаю, что arraylist выполняет поиск ao (N).
Алгоритм, который вы опубликовали, на самом деле хуже, чем O (N)
- Итерация по списку ввода
lstEntities
- O (N) - в этомцикл, вы вызываете
ArrayList.indexOf(T)
, который должен сканировать список - O (N) снова
Вы на самом деле алгоритм O (N ^ 2), так как вы потенциально сканируете список дважды в цикле.
Похоже, что вы действительно хотите выполнить две операции:
- С входа
List
удалить все дубликаты - Когда вы найдете дубликаты, "объединить" сущности.
Вы можете сделать это путем сканирования списка только один раз, а не во вложенных циклах.Я бы рекомендовал разбить ваш Entity
, чтобы переместить поля, которые «идентифицируют» сущность, в другой тип, такой как ID
, или, по крайней мере, добавить метод getID()
, который может вернуть эти поля, сгруппированные в один тип.,Таким образом, вы можете легко построить карту между двумя типами, чтобы иметь возможность объединять сущности с «дублирующимися» идентичностями.Это может выглядеть примерно так:
Map<ID, Entity> map = new HashMap<ID, Entity>(inputList.size());
for (Entity e : inputList) {
Entity existing = map.get(e.getID());
if (existing == null) {
//not in map, add it
map.put(e.getID(), e);
}
else {
existing.merge(e);
}
}
Итерация по списку - O (n), в то время как HashMap.get(K)
- операция с постоянным временем.