Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/34: Рейтинг темы: голосов - 34, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 26.11.2013
Сообщений: 14

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

29.08.2015, 11:19. Показов 6379. Ответов 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, для синхронизации таблицы  
Изображения
 
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.08.2015, 11:19
Ответы с готовыми решениями:

Инициализация элементов списка списков (List<List>) происходит одинаково для каждого элемента
Доброго времени суток. Не знаю как лучше озаглавить эту тему, но у меня проблема со следующим участком кода: using System; using...

Объединение двух списков List<string>
Есть 2 списка Schedule И Changes. В каждом есть несколько элементов вида №. Lesson Group|Cab (пример: 1. Математика И-10|407). Нужно...

Сравнение двух списков
Доброго всем времени суток. Изначальное задание было вот таким - &quot;написать программу, содержащую функцию, которая определяет, входит...

6
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
29.08.2015, 11:47
NIKMC-I, в чем проблема в дебаге пройти и посмотреть где не так работает?


Алгоритм должен быть такой.
-Переписать локальный список в HashMap с кючом ID и значением Course
-Пройти по списку сервера. Для каждого элемента пытаемся вытащить из мапы элемент по ID.
-Если находим, добавляем в список тех кому нужно сделать апдейт и удаляем из мапы
-Если не находим добавляем в список кому делать инсерт и удаляем из мапы
-После окончания списка сервера, все что осталось в мапе подлежит удалению
2
1 / 1 / 0
Регистрация: 26.11.2013
Сообщений: 14
29.08.2015, 18:30  [ТС]
Большое спасибо за совет. В следующий раз будут делать так, но в этот раз не могли бы Вы, как опытный программист помочь мне именно с тем алгоритмом, который я начал писать, но не получается сделать.Буду очень признателен.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
29.08.2015, 20:12
Лучший ответ Сообщение было отмечено NIKMC-I как решение

Решение

Цитата Сообщение от 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;
    }
1
1 / 1 / 0
Регистрация: 26.11.2013
Сообщений: 14
29.08.2015, 21:40  [ТС]
Огромное Вам человеческое спасибо. Прошу Вас поправить строчку кода
Java
1
localCoursesMap.remove(course);
на
Java
1
localCoursesMap.remove(course.getCourseId());
т.к. поиск происходит по ключу, и другие могут не правильно понять. И у меня есть вопрос. Если проводить синхронизацию, допустим, 3 млн. записей, то какой вариант будет более быстрым? Ваш или этот алгоритм, который я не смог сделать + еще ведь сортировка записей? И я так понимаю, для Вашего метода с hashmap, нет необходимости тратить время и проводить сортировку записей?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
29.08.2015, 21:53
Цитата Сообщение от NIKMC-I Посмотреть сообщение
Прошу Вас поправить строчку кода
Да вы правы. Код я писал не запуская поэтому ошибся. Поправить уже немогу т.к редактирование закрыто.

Ваш код особо не смотрел, но по-моему там сложность O(n^2) и много лишних проходов по коллекции. В моем варианте сложность алгоритма линейная, однако 3млн вы скорее всего несможете обработать т.к нехватит памяти. Если вам надо обрабатывать 3млн, у вас неправильный подход к задаче.
0
420 / 357 / 47
Регистрация: 22.05.2013
Сообщений: 2,518
30.08.2015, 07:17
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
т.к нехватит памяти
Андроид - вообще рискованная работа с памятью! В любую секунду программа может вылететь или гаджет перегрузиться. Особенно если тяжелая игрушка в памяти осталась или программ загружено столько что новые говорят "нет места для установки"...

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

Хотя... если записей не больше 100-500... (чаты, товары в интернет магазине, новости, ...) можно и в памяти поработать... (ютюб похоже так-же работает - на сотне роликов на странице начинает "тормозить" и жрать память/проц)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2015, 07:17
Помогаю со студенческими работами здесь

Сравнение двух списков
Есть программа, которая сравнивает два списка по присутствию в них символов, т.е. для equalset(,) выдаст истину, а для equalset(,) - ложь....

Сравнение двух списков
Здравствуйте, подскажите пожалуйста, пол дня гуглю, не нашёл подходящей информации. Нужно удалить все элементы List A, которые содержит...

Сравнение двух списков
Есть списки log0 и log3, в результат хочу выписать те пары элементов, которые в этих двух списках различны var result =...

Сравнение двух списков
Нужно с помощью функций высшего порядка узнать какое кол-во элементов есть как в первом, так и во втором списке, и сколько из них на соотв....

Сравнение двух списков
имеется 2 списка примерно такого типа: 1;2;3;4;0 и 1;2;3;4;1 1;2;3;4;2 и 1;2;3;4;2 1;2;3;4;3 и 1;2;3;4;3 1;2;3;4;4 и ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru