Pull to refresh

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

Reading time2 min
Views3.4K
Доброй ночи, сообщество.

В текущем проекте, над которым я работаю, возникла необходимость определить изменения в двух коллекциях данных. Если в двух словах, то с Сервера приходит 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. Спите чаще и больше, это полезно!
Tags:
Hubs:
Total votes 16: ↑5 and ↓11-6
Comments4

Articles