Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
NIKMC-I
1 / 1 / 0
Регистрация: 26.11.2013
Сообщений: 14
#1

Алгоритм сравнение двух списков list, для синхронизации таблицы - Программирование Android

29.08.2015, 11:19. Просмотров 856. Ответов 6
Метки нет (Все метки)

Добрый день форумчане. Очень нужна ваша помощь, срочно. Необходимо сделать синхронизацию локальной таблицы с таблицей загруженной из сервера. Было принято решение поэтапно сравнивать два списка(локальный список и серверный). Первоначально, списки были отсортированы. Далее осталось в этапном сравнивании по id. Если id в локальном списке есть, а в серверном нет, то удаление из локальной бд записи(delete). Если id локальной и серверной равны, то обновление(update). Если id серверной есть, а в локальной нет, до добавление(select). Проблема у меня как раз в поэтапном сравнении, где-то ошибаюсь, что-то не предусмотрел. Скидываю свой алгоритм сравнения и изображения примера. Прошу доработайте его пожалуйста.

Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public void check(List<Course> serverCourse, List<Course> localCourse) {
        Iterator<Course> server = serverCourse.iterator();
        Iterator<Course> local = localCourse.iterator();
        DatabaseHandler db = new DatabaseHandler(context);
        Course item1 = server.next();
        Course item2 = local.next();
 
         while (server.hasNext()) {
 
            if (item1.getCourse_id() <item2.getCourse_id()) {
                db.addCourse(item1); // Добавление новой записи в локальную таблицу
                item1 = server.next();
            }
            else
            {
                while(item2.getCourse_id() < item1.getCourse_id()) {
                    db.deleteCourse(item2); // Удаление из локальной таблицы записи, не существующей на сервере
                    item2 = local.next();
                }
 
                if (item1.getCourse_id() == item2.getCourse_id())
                {
                    db.updateCourse(item1); // обновление записи
                    item2 = local.next();
                }
            }
        }
    }
Миниатюры
Алгоритм сравнение двух списков list, для синхронизации таблицы  
Изображения
 
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2015, 11:19     Алгоритм сравнение двух списков list, для синхронизации таблицы
Посмотрите здесь:
Сравнение двух строк Android
Обновление приложения путём синхронизации с сервером Android
Android Ошибка синхронизации Gradle при попытке создания проекта Android в IntelliJ IDEA
Android Не стандартное окно для двух камер
Android Gradle объединить ресурсы для двух сборок
Код для двух кнопок в одном активити Android
Android Высокопроизводительные таблицы для отображение большого количетсва данных
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KEKCoGEN
Эксперт Java
1909 / 1787 / 434
Регистрация: 28.12.2010
Сообщений: 7,213
29.08.2015, 11:47     Алгоритм сравнение двух списков list, для синхронизации таблицы #2
NIKMC-I, в чем проблема в дебаге пройти и посмотреть где не так работает?


Алгоритм должен быть такой.
-Переписать локальный список в HashMap с кючом ID и значением Course
-Пройти по списку сервера. Для каждого элемента пытаемся вытащить из мапы элемент по ID.
-Если находим, добавляем в список тех кому нужно сделать апдейт и удаляем из мапы
-Если не находим добавляем в список кому делать инсерт и удаляем из мапы
-После окончания списка сервера, все что осталось в мапе подлежит удалению
NIKMC-I
1 / 1 / 0
Регистрация: 26.11.2013
Сообщений: 14
29.08.2015, 18:30  [ТС]     Алгоритм сравнение двух списков list, для синхронизации таблицы #3
Большое спасибо за совет. В следующий раз будут делать так, но в этот раз не могли бы Вы, как опытный программист помочь мне именно с тем алгоритмом, который я начал писать, но не получается сделать.Буду очень признателен.
KEKCoGEN
Эксперт Java
1909 / 1787 / 434
Регистрация: 28.12.2010
Сообщений: 7,213
29.08.2015, 20:12     Алгоритм сравнение двух списков list, для синхронизации таблицы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от NIKMC-I Посмотреть сообщение
помочь мне именно с тем алгоритмом
нет т.к дебажить в уме нет желания. Если хотите, вот нормальная реализация

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void check(List<Course> serverCourses, List<Course> localCourses) {
        List<Course> toInsert = new ArrayList<Course>();
        List<Course> toUpdate = new ArrayList<Course>();
        List<Course> toDelete = new ArrayList<Course>();
        
        HashMap<Long, Course> localCoursesMap = buildCourseMap(localCourses);
        for (Course course : serverCourses) {
            if(localCoursesMap.get(course.getCourseId()) != null) {
                toUpdate.add(course);
            }else{
                toInsert.add(course);
            }
            localCoursesMap.remove(course);
        }
        toDelete.addAll(localCoursesMap.values());
        
        //DatabaseHandler db = new DatabaseHandler(context);
        //save update and delete here
       
    }
 
    private HashMap<Long, Course> buildCourseMap(List<Course> courseList) {
        HashMap<Long, Course> resultMap = new HashMap<Long, Course>();
        for (Course course : courseList) {
            resultMap.put(course.getCourseId(), course);
        }
        return resultMap;
    }
NIKMC-I
1 / 1 / 0
Регистрация: 26.11.2013
Сообщений: 14
29.08.2015, 21:40  [ТС]     Алгоритм сравнение двух списков list, для синхронизации таблицы #5
Огромное Вам человеческое спасибо. Прошу Вас поправить строчку кода
Java
1
localCoursesMap.remove(course);
на
Java
1
localCoursesMap.remove(course.getCourseId());
т.к. поиск происходит по ключу, и другие могут не правильно понять. И у меня есть вопрос. Если проводить синхронизацию, допустим, 3 млн. записей, то какой вариант будет более быстрым? Ваш или этот алгоритм, который я не смог сделать + еще ведь сортировка записей? И я так понимаю, для Вашего метода с hashmap, нет необходимости тратить время и проводить сортировку записей?
KEKCoGEN
Эксперт Java
1909 / 1787 / 434
Регистрация: 28.12.2010
Сообщений: 7,213
29.08.2015, 21:53     Алгоритм сравнение двух списков list, для синхронизации таблицы #6
Цитата Сообщение от NIKMC-I Посмотреть сообщение
Прошу Вас поправить строчку кода
Да вы правы. Код я писал не запуская поэтому ошибся. Поправить уже немогу т.к редактирование закрыто.

Ваш код особо не смотрел, но по-моему там сложность O(n^2) и много лишних проходов по коллекции. В моем варианте сложность алгоритма линейная, однако 3млн вы скорее всего несможете обработать т.к нехватит памяти. Если вам надо обрабатывать 3млн, у вас неправильный подход к задаче.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2015, 07:17     Алгоритм сравнение двух списков list, для синхронизации таблицы
Еще ссылки по теме:
Android Использование разных onTouch для двух Layout элемента
Кастомизация списков Android
Android Несколько списков в приложении
LINQ Сравнение двух списков
Prolog Сравнение двух списков

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,518
30.08.2015, 07:17     Алгоритм сравнение двух списков list, для синхронизации таблицы #7
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
т.к нехватит памяти
Андроид - вообще рискованная работа с памятью! В любую секунду программа может вылететь или гаджет перегрузиться. Особенно если тяжелая игрушка в памяти осталась или программ загружено столько что новые говорят "нет места для установки"...

Я предпочитаю все грузить в таблицы SQLite на флешку (уверен что внешняя флешка не скажет "место закончилось") и в потоке их обрабатывать. С индикаторной полоской в нотифе или в программе. Пусть долго (хоть полчаса/час = раза в 2-5 дольше чем в чистой памяти), но уверен что и 3миллиона будут обработанны "с подтверждением"... Опять-же для ускорения можно разделить на две таблицы - данные и код/статус. Можно подгружать по 100-1000 записей в память в "мапы" и сравнивать там, потом лишь выгружать в базы результаты (в случае зависания потеряю результат обработки лишь последней "сотни")...

Хотя... если записей не больше 100-500... (чаты, товары в интернет магазине, новости, ...) можно и в памяти поработать... (ютюб похоже так-же работает - на сотне роликов на странице начинает "тормозить" и жрать память/проц)
Yandex
Объявления
30.08.2015, 07:17     Алгоритм сравнение двух списков list, для синхронизации таблицы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru