java - 2个大列表之间的列表比较
问题描述
我需要比较 2 盏灯,list1 和 list2。List2 有历史数据(根据前几天的数据准备)。List1 将是当前数据(今天的数据)。List1 将包含新添加的对象,也可能包含对它们进行了一些更新的旧对象。此外,一些对象可能会在这 24 小时内从系统中删除。因此,这个已删除的对象将出现在 list2(昨天的数据)中,但不在 list1(今天的)数据中。因此,请建议我将 list1 与 list2 进行比较并找到新的、更新的、已删除的对象的最佳方法。两个列表中都有大约 60 到 70 千个项目对象。两者都是巨大的清单。
解决方案
我建议您将两个列表放入单独的排序列表或排序映射(如果对象不实现“可比”,则排序映射)。
这将非常快,并且不会占用太多资源。在此之后,您将有两个排序列表,您可以进行一次传递。从两个这样的排序集合开始:
清单 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) 留在“已更新”列表中,该列表将成为您的“已添加”对象列表。
推荐阅读
- sql - 生成唯一的批次 ID (SQL Server)
- algorithm - 将坐标匹配到最近的开始和结束纬度/经度对
- java - 清除捆绑器数据
- python - AttributeError:“超级”对象没有属性
- angular - 如何在没有顶部选项卡 App.components 根目录的情况下导航页面
- c# - UltraGrid 和 WebDateChooser
- database - 部署 Docker swarm 时在 docker_gwbridge 中设置 IPV4 地址
- c# - 非线性正交缩放
- angular - SortBy linq 不工作
- php - 执行命令 give top: failed tty get