Доброй ночи, сообщество.
В текущем проекте, над которым я работаю, возникла необходимость определить изменения в двух коллекциях данных. Если в двух словах, то с Сервера приходит 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. Спите чаще и больше, это полезно!
ссылка на оригинал статьи https://habrahabr.ru/post/279633/
Добавить комментарий