Поиск изменений в двух коллекциях

от автора

Доброй ночи, сообщество.

В текущем проекте, над которым я работаю, возникла необходимость определить изменения в двух коллекциях данных. Если в двух словах, то с Сервера приходит 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/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *