Comments 4
Оптимальным — по какому параметру? По размеру юзер-кода — наверное, да. Но там у вас используется indexOf по одному из списков, так что вряд ли по времени исполнения (на больших списках).
Посмотрите, как работает diff. По сути — это решение для вашей задачи. Это если строки в списках не перемешаны. Если перемешаны, то нужны конечно дополнительные финты ушами.
Посмотрите, как работает diff. По сути — это решение для вашей задачи. Это если строки в списках не перемешаны. Если перемешаны, то нужны конечно дополнительные финты ушами.
0
Страх и ужас:
Если списки сортированы, то можно не использовать квадратичный алгоритм (итерация по
- модификация входных данных (
oldData
,newData
) — явный code smell; updated = 0
всегда, т. к. еслиnewData.indexOf(oldItem) >= 0
, то либоoldItem == null
, либоoldItem.equals(newData.get(index))
;- непонятно зачем нужная нагрузка на GC, если используются ArrayList'ы (засчёт
oldDataIterator.remove()
иnewData.remove(index)
, а если используетсяLinkedList
— то вообще убиться веником;
Если списки сортированы, то можно не использовать квадратичный алгоритм (итерация по
oldData
+ List#indexOf
), а сделать линейный проход двумя итераторами/по индексам. Если нет, то использовать два HashSet'а:Set<T> insertedData = new HashSet<>(newData);
insertedData.removeAll(oldData);
inserted = insertedData.size();
Set<T> removedData = new HashSet<>(oldData);
removedData.removeAll(newData);
removed = removedData.size();
+11
Sign up to leave a comment.
Поиск изменений в двух коллекциях