Доброй ночи, сообщество.
В текущем проекте, над которым я работаю, возникла необходимость определить изменения в двух коллекциях данных. Если в двух словах, то с Сервера приходит List заказов и в БД лежит такой же List заказов. Нужно определить сколько заказов было добавлено, обновлено и удалено в новой коллекции. Заинтересовавшихся прошу под кат.
Вроде как тривиальная задача скажете Вы и будете правы! Но я не спал уже 3 дня, поэтому изначально мой код получился в 3 цикла.Херня Херня подумал я и начал сначала. Даже код приводить не буду :)
Через полчаса родился класс в 2 цикла — проходимся по новым данным и считаем новые и обновленные, потом проходимся по старым и считаем удаленые. Код тоже приводить не стану, потому что мне сразу захотелось уместить все в один цикл и по совету одной статьи я избавился от только что написанного класса.
Итак, спустя еще 30 минут я написал класс CollectionChangeCouner, алгоритм работы которого на мой взгляд является оптимальным.
На этом как бы все :)
Надеюсь кому-то поможет моя мини статья ни о чем, или может умные захабренные дядьки подскажут вариант получше. Но боюсь, что прочту я уже об этом завтра.
P.S. Спите чаще и больше, это полезно!
В текущем проекте, над которым я работаю, возникла необходимость определить изменения в двух коллекциях данных. Если в двух словах, то с Сервера приходит List заказов и в БД лежит такой же List заказов. Нужно определить сколько заказов было добавлено, обновлено и удалено в новой коллекции. Заинтересовавшихся прошу под кат.
Вроде как тривиальная задача скажете Вы и будете правы! Но я не спал уже 3 дня, поэтому изначально мой код получился в 3 цикла.
Через полчаса родился класс в 2 цикла — проходимся по новым данным и считаем новые и обновленные, потом проходимся по старым и считаем удаленые. Код тоже приводить не стану, потому что мне сразу захотелось уместить все в один цикл и по совету одной статьи я избавился от только что написанного класса.
Итак, спустя еще 30 минут я написал класс CollectionChangeCouner, алгоритм работы которого на мой взгляд является оптимальным.
Листинг
import java.util.Iterator;
import java.util.List;
/**
* Created by vitaliy on 18.03.2016.
*
*/
public class CollectionChangeCouner<T> {
private int inserted;
private int updated;
private int deleted;
public CollectionChangeCouner(List<T> oldData, List<T> newData) {
Iterator<T> oldDataIterator = oldData.iterator();
while (oldDataIterator.hasNext()) {
T oldItem = oldDataIterator.next();
int index = newData.indexOf(oldItem);
if (index < 0) {
deleted++;
oldDataIterator.remove();
} else {
final T newItem = newData.get(index);
if (!oldItem.equals(newItem)) {
updated++;
}
newData.remove(index);
}
}
inserted = newData.size();
}
public int inserted() {
return inserted;
}
public int updated() {
return updated;
}
public int deleted() {
return deleted;
}
public boolean hadChangedData() {
return (inserted > 0)
|| (updated > 0)
|| (deleted > 0);
}
}
На этом как бы все :)
Надеюсь кому-то поможет моя мини статья ни о чем, или может умные захабренные дядьки подскажут вариант получше. Но боюсь, что прочту я уже об этом завтра.
P.S. Спите чаще и больше, это полезно!