首页 > 解决方案 > 2个大列表之间的列表比较

问题描述

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

标签: javalistperformanceloopsarraylist

解决方案


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

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

    清单 1 清单 2
   原始更新
      抗体
      抄送
      德
      fg
      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) 留在“已更新”列表中,该列表将成为您的“已添加”对象列表。


推荐阅读