从两个 ListProperty 中删除所有重合项
Remove no coincidents from two ListProperty
我的目标是:实现两个 "identical" 列表,在尽可能短的时间内从两个列表中删除不重合的对象。
我取得的成就:两个相同的列表,删除了非重合项,但耗时太长。
我的问题是:
我有两个大列表(每个有 800k 条记录),这些列表中充满了对象(在这些对象上正确实现了 HashCode 和 Equals),我需要删除两个列表中不重合的记录。它可能只有 3-100 条记录(与 800k 寄存器相比不算什么)。
主要是性能问题,导致操作需要10多分钟。
这是我试过的:
retainAll:这可行,但时间太长
使用 HashSet.retainAll:无法在我的列表中使用集合。它需要几秒钟,效果很好,但我需要重复
手动:从列表 1 中逐一查找列表 2,在第三个列表中不保存重合项,在第四个列表中向后重复操作,然后对两个列表使用 removeAll。
迭代器:复制列表看起来是个好主意,从两个复制的列表中删除巧合,这样我每次循环的项目更少,我只需要找到一次,因为剩余的是非巧合。最后使用 removeAll 从原始列表中删除非重合项,但仍需要 +-10 分钟。
我需要找到一种更快的方法来执行此操作,但无法弄清楚。
关于重复项:听起来很奇怪,但对于我的程序来说,如果 2 个对象具有相同的 "name" 但在我需要的其他属性中可能具有不同的值,则它们是相等的。
不理解名称相等但值不相等的所有原因.. 甚至不理解列表 A 是否具有 "foo",列表 B 是否具有 2x "foo" 如果你想保留所有 "foo"...
这是一个想法.. 将 "name" 的哈希集创建为同名对象数组...现在您可以使用 retainAll 然后从哈希集值快速重建原始集合。
我的目标是:实现两个 "identical" 列表,在尽可能短的时间内从两个列表中删除不重合的对象。
我取得的成就:两个相同的列表,删除了非重合项,但耗时太长。
我的问题是:
我有两个大列表(每个有 800k 条记录),这些列表中充满了对象(在这些对象上正确实现了 HashCode 和 Equals),我需要删除两个列表中不重合的记录。它可能只有 3-100 条记录(与 800k 寄存器相比不算什么)。
主要是性能问题,导致操作需要10多分钟。
这是我试过的:
retainAll:这可行,但时间太长
使用 HashSet.retainAll:无法在我的列表中使用集合。它需要几秒钟,效果很好,但我需要重复
手动:从列表 1 中逐一查找列表 2,在第三个列表中不保存重合项,在第四个列表中向后重复操作,然后对两个列表使用 removeAll。
迭代器:复制列表看起来是个好主意,从两个复制的列表中删除巧合,这样我每次循环的项目更少,我只需要找到一次,因为剩余的是非巧合。最后使用 removeAll 从原始列表中删除非重合项,但仍需要 +-10 分钟。
我需要找到一种更快的方法来执行此操作,但无法弄清楚。
关于重复项:听起来很奇怪,但对于我的程序来说,如果 2 个对象具有相同的 "name" 但在我需要的其他属性中可能具有不同的值,则它们是相等的。
不理解名称相等但值不相等的所有原因.. 甚至不理解列表 A 是否具有 "foo",列表 B 是否具有 2x "foo" 如果你想保留所有 "foo"...
这是一个想法.. 将 "name" 的哈希集创建为同名对象数组...现在您可以使用 retainAll 然后从哈希集值快速重建原始集合。