Сравнение списков между двумя большими списками - PullRequest
0 голосов
/ 12 февраля 2020

Мне нужно сравнить 2 лита, list1 и list2. List2 имеет исторические данные c (подготовленные на основе данных предыдущих дней). List1 будет текущими данными (сегодняшние данные). List1 будет содержать недавно добавленные объекты и может также содержать старые с некоторыми обновлениями, сделанными для них. Также некоторые объекты могут быть удалены из системы в течение этих 24 часов. Таким образом, эти удаленные объекты будут присутствовать в списке list2 (вчерашние данные), а не в списке list1 (сегодняшние). Поэтому, пожалуйста, предложите мне лучший способ сравнить list1 со list2 и найти новые, обновленные, удаленные объекты. В обоих списках содержится от 60 до 70 тысяч объектов. Оба огромных списка.

1 Ответ

1 голос
/ 12 февраля 2020

Я предлагаю вам поместить оба списка в отдельные отсортированные списки или отсортированные карты (отсортированная карта, если объекты не реализуют «сопоставимые»).

Это будет очень быстро и не займет столько ресурсов. После этого у вас будет два отсортированных списка, вы можете сделать один проход. Начните с двух отсортированных коллекций, таких как:

    list 1    list 2
   original   updated
      a         b
      c         c
      d         e
      f         g
      g

Если вы сделаете два указателя (на первый элемент в каждом списке), вы можете сравнить их. Если они совпадают, вы можете проверить наличие «Обновлений» (добавить его в потенциально обновленный список). В противном случае один должен быть «Меньше», чем другой (а «Меньше», чем б). Если «Нижний» находится в списке 1, добавьте его в список «новых» объектов. Если «Нижний» находится в списке 2, добавьте его в столбцы «Удаленные».

Затем просто увеличьте указатель до нижнего из двух и повторите.

Есть и другие способы это может быть проще, например,

sharedList = originalList.removeAll(updatedList) 

сделает это:

(a, c, d, f, g) .removeAll (b, c, e , g) вернет (c, g), которые являются дублирующими значениями, это значения, которые могут быть обновлены (они существовали в обоих списках).

Первоначальный список станет (a, d , f) после удаления (c, g) это список «старых» значений, которые были удалены между двумя списками.

Чтобы получить список «новых элементов», вам просто нужно удалить ранее существующие элементы, которые вы только что сгенерировали, из «обновленного» списка.

updated.removeAll(shared)

превратит ваш обновленный список в список «новых / добавленных» элементов.

(b , c, e, g) .removeAll (c, g) оставит (b, e) в «обновленном» списке, который станет вашим списком «добавленных» объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...