我有2个列表。这两个列表都具有相同类型的所有元素,但是每次我需要执行以下操作时,类型都可以不同。每个列表都进行排序。
这些列表是图表的X值,每个列表是图表中一系列的X值。我需要合并它们以获得合并值。一个简单的示例是X是DateTime对象,一个列表只有工作日,而另一个列表也有周末。
更复杂的示例是相同的X值可以多次出现。因此,如果它在一个列表中出现两次,而在另一个列表中发生三次,那么我在最终列表中需要它三次。
是否有比仅遍历两个列表并根据需要将列表2中的新条目插入列表1更简单的方法?
当我遍历作为对象键入的列表(可以是数字,字符串或DateTime)时,是否可以调用一些库调用来获取每对对象上的不等式?
更新:
让我根据以下评论添加一些内容:
答案 0 :(得分:0)
这听起来像是对标准双向合并的简单修改。首先,分别对两个列表进行排序。然后,执行标准合并,仅复制匹配重复项。您只需要跟踪每个列表中的上一个项目即可。
基本上,如果两个项目不相等,并且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++