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



我需要比较 2 升、列表 1 和列表 2。List2 具有历史数据(根据前几天的数据准备(。List1 将是当前数据(今天的数据(。List1 将包含新添加的对象,也可能包含对它们进行一些更新的旧对象。此外,某些对象可能会在这 24 小时内从系统中删除。因此,这些已删除的对象将出现在list2(昨天的数据(中,但不存在于list1(今天的(数据中。因此,请建议我最好地将list1与list2进行比较,并找到新的,更新的,已删除的对象。这两个列表中都有大约 60 到 70 个千个项目对象。两者都是巨大的清单。

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

这将非常快,并且不会占用那么多资源。 在此之后,您将有两个排序列表,您可以进行一次传递。 从两个排序的集合开始,如下所示:

列表
1 列表 2  原始更新 一 乙 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( 保留在"更新"列表中,该列表将成为您的"已添加"对象列表。

最新更新