2个大型列表之间的列表比较

时间:2020-02-12 17:17:26

标签: java list performance loops arraylist

我需要比较2灯,list1和list2。 List2具有历史数据(根据前几天的数据准备)。 List1将是当前数据(今天的数据)。 List1将包含新添加的对象,也可能包含旧对象,并对其进行了一些更新。另外,在这24小时内,某些对象可能会从系统中删除。因此,此删除的对象将出现在list2(昨天的数据)中,而不出现在list1(今天的数据)中。因此,请向我建议比较list1与list2并查找新的,更新的,删除的对象的最佳方法。这两个列表中都有大约60到70个大量项目对象。两者都是巨大的清单。

1 个答案:

答案 0 :(得分:1)

我建议您将两个列表都放入单独的排序列表或排序映射中(如果对象未实现“可比较”,则将其排序)。

这将非常快并且不会占用太多资源。此后,您将获得两个排序的列表,您可以进行一次通过。从两个排序的集合开始,像这样:

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

如果创建两个指针(指向每个列表的第一项),则可以对其进行比较。如果它们相同,则可以检查“更新”(将其添加到可能更新的列表中)。否则,一个必须比另一个“低”(a比“ b”低)。如果“低级”位于列表1中,则将其添加到“新”对象的列表中。如果列表2中有“较低”字样,请将其添加到“已删除”列中。

然后将指针增加到两个中的较低者并重复。

还有其他一些可能更简单的方法,例如

sharedList = originalList.removeAll(updatedList) 

会这样做:

(a,c,d,f,g).removeAll(b,c,e,g)将返回(c,g)这是重复值,这些是可能更新的值(它们存在于这两个列表)。

在删除(c,g)后,原始列表将变为(a,d,f),这是在两个列表之间已删除的“旧”值的列表。

要获取“新项目”列表,只需从“已更新”列表中删除刚刚生成的先前存在的项目。

updated.removeAll(shared)

会将更新后的列表变成“新/添加”项的列表。

(b,c,e,g).removeAll(c,g)将(b,e)保留在“已更新”列表中,该列表成为您的“已添加”对象列表。