Объединение списков, вставка уникальных записей

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

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

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

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

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

Обновить:

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

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

Всего 1 ответ


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

В принципе, если два элемента не равны и 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++

Есть идеи?

10000