Слияние списков, вставка уникальных записей - PullRequest
0 голосов
/ 24 октября 2018

У меня есть 2 списка списков.Оба списка имеют все элементы одного типа, но тип может отличаться каждый раз, когда мне нужно выполнить следующее.И каждый список отсортирован.

Эти списки представляют собой значения X для диаграммы, каждый список представляет собой значения X для ряда в диаграмме.Мне нужно объединить их, чтобы получить объединенные значения.Простым примером является X - объекты DateTime, и у одного списка есть только дни недели, а у другого тоже дни выходных.

Более сложный пример, когда одно и то же значение X может встречаться несколько раз.Поэтому, если это происходит дважды в одном списке и три раза в другом, мне нужно трижды в окончательном списке.

Есть ли более простой способ, чем просто пройтись по двум спискам и вставить новые записи из списка 2 вПри необходимости перечислите один из них?

И когда я обхожу список, который напечатан как объекты, так как это может быть число, строка или DateTime, есть ли какой-нибудь библиотечный вызов, который я могу вызвать для получения неравенства для каждой пары?объектов?

Обновление:

Позвольте мне добавить пару вещей, основываясь на комментариях ниже:

  1. Я не знаютип во время компиляции.Это должно обрабатывать данные диаграммы, а значения X могут быть строками, числами (целыми числами или числами с плавающей запятой), DateTime и, возможно, парой других типов.Все, что я знаю, это то, что все значения в каждом конкретном прогоне будут одного типа.
  2. То, что мне нужно, отличается от AddRange () или Union ().Если в списке A дважды 5, а в списке B три раза, мне нужно трижды в окончательном списке.
  3. У меня нет примера кода, потому что я пытаюсь выяснить, чтодолжен быть код для этого.
  4. В основном мне нужно Union () , но где он обрабатывает случай дублирующихся записей в каждом списке.

1 Ответ

0 голосов
/ 24 октября 2018

Это звучит как простая модификация стандартного двустороннего слияния.Сначала отсортируйте два списка по отдельности.Затем выполните стандартное объединение, которое копирует только совпадающих дубликатов.Вам просто нужно отслеживать предыдущий элемент в каждом списке.

По сути, если два элемента не равны и a.current == b.prev или b.current == a.prev, то вы не копируете элемент.Что-то вроде:

// This assumes that list1 and list2 are sorted.
l1 = 0
l2 = 0
lOutput = 0
l1Prev = null
l2Prev = null
while (l1 < list1.length && l2 < list2.length)
    if (list1[l1] == list2[l2])
        output[lOutput++] = list1[l1]
        l1Prev = list1[l1]
        l2Prev = list2[l2]
        l1++
        l2++
    else if (list1[l1] == l2Prev)
        // skip the list1 item because it's equal to the previous
        // list2 item
        l1Prev = list1[l1]
        l1++
    else if (list2[l2] == l1Prev)
        // skip the list2 item because it's equal to the previous
        // list1 item
        list2 = list2[l2]
        l2++
    else if (list1[l1] < list2[l2])
        output[lOutput++] = list1[l1]
        l1Prev = list1[l1]
        l1++
    else
        output[lOutput++] = list2[l2]
        l2Prev = list2[l2]
        l2++
// at this point, one of the lists is not empty
while (l1 < list1.length)
    if (list1[l1] != l2Prev)
        output[lOutput++] = list1[l1]
    l1Prev = list1[l1]
    l1++

while (l2 < list2.length)
    if (list2[l2] != l1Prev)
        output[lOutput++] = list2[l2]
    l2Prev = list2[l2]
    l2++
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...