Лучший способ - это переключиться на другую структуру данных. A Map<Integer, User>
будет лучшим, потому что предположительно пользователи имеют уникальные идентификаторы. Вы можете выбрать реализацию Map
: HashMap
(ожидается O(1)
для основных операций) или TreeMap
(O(log N)
).
ВАЖНО: Вы @Override equals(Object)
без @Override hashCode()
!!! Это опасно ! Вы должны всегда иметь привычку переопределять ни то, ни другое! (см .:
Переопределение equals и hashCode в Java
)
Итак, допустим, у вас есть Map<Integer, User> remoteUsers
и Map<Integer, User> localUsers
.
1.) Если удаленный пользователь уже существует локально, обновите его поля.
4.) Если в удаленном списке также появляется локальный пользователь, обновите его поля. (аналогично 1)
2.) Если удаленный пользователь еще не существует локально, добавьте пользователя.
Нахождение, если User
из remoteUsers
находится в localUsers
, можно ответить в O(1)
или O(log N)
с помощью простых containsKey
и get
.
for (int id : remoteUsers.keys()) {
User local;
if (localUsers.containsKey(id)) {
local = localUsers.get(id);
else {
localUsers.put(id, local = new User(id));
}
local.updateFrom(remoteUsers.get(id));
}
3.) Если локальный пользователь не отображается в удаленном списке, отключите его или удалите.
Следующее решение показывает, насколько мощными могут быть эти более сложные структуры данных:
Set<Integer> toDeactivate = new TreeSet<Integer>();
toDeactivate.addAll(localUsers.keySet());
toDeactivate.removeAll(remoteUsers.keySet());
for (int id : toDeactivate) {
User local = localUsers.get(id);
local.deactivate();
localUsers.remove(id);
}
Кроме того, если вы застряли с List<User>
, вы все равно можете использовать Map<Integer, User>
в качестве промежуточной структуры данных для этой обработки (в основном преобразуйте List<User>
в Map<Integer, User>
и затем обратно в List<User>
). Это будет все еще быстрее, так как это O(N log N)
или O(N)
, по сравнению с O(N^2)
, который у вас есть прямо сейчас.
Если вы настаиваете на использовании только списков, то вы можете захотеть сделать из этого список Collections.sort
, так что вы можете сделать с ним Collections.binarySearch
. Вам нужно будет предоставить Comparator<User>
или сделать User implements Comparable<User>
, естественно заказывая по id
. Это тоже будет O(N log N)
.