【问题标题】:List comparison between 2 large lists2个大列表之间的列表比较
【发布时间】:2020-02-12 17:17:26
【问题描述】:

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

【问题讨论】:

  • 编辑问题以修正错别字并进行其他必要的更改。不要在评论中这样做。删除评论。
  • 列表是否有序?
  • 无序列表
  • 列表中的对象是否具有可比性(小于/大于)?换句话说,你能对它们进行排序吗?否则,此过程将花费两个数量级的时间
  • 以 Employee 对象为例。员工有身份证、姓名、手机号码等和地址。再次类类型中的地址。所以两个列表现在都有这个员工对象。 List1是根据今天的系统数据准备的,list2是根据昨天的系统数据准备的

标签: java list performance loops arraylist


【解决方案1】:

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

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

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

【讨论】:

  • 另一种方式更简单,感谢Bill的帮助
  • @user12887299 如果它解决了您的问题,“接受”我的回答并不是一个坏主意。最终堆栈溢出会抱怨你建议你选择一个答案。
猜你喜欢
  • 2011-02-21
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-26
  • 1970-01-01
相关资源
最近更新 更多