0

我的目标是:实现两个“相同”的列表,在尽可能少的时间内从这两个列表中删除不重合的对象。

我所取得的成就:两个相同的列表,删除非重合,但耗时太长。

我的问题是:

我有两个大列表(每个 800k 记录),这些列表充满了对象(HashCode 和 Equals 在这些对象上正确实现),我需要删除两个列表上的非重合记录。它可能只有 3-100 条记录(与 800k 寄存器相比没有)。

问题主要是性能,导致它需要 10 多分钟才能完成操作。

这是我尝试过的:

  • retainAll:这行得通,但耗时太长

  • 使用 HashSet.retainAll:不能在我的列表中使用集合。这需要几秒钟,效果很好,但我需要重复

  • 手动:从列表 1 中逐一查看列表 2,在第三个列表中不保存重合,在第四个列表中向后重复操作,然后对两个列表使用 removeAll。

  • 迭代器:复制列表看起来是个好主意,从两个复制的列表中删除重合,这样我每个循环的项目更少,我只需要找到一次,因为剩余的不是重合。最后使用 removeAll 从原始列表中删除非重合,但仍需要 +-10 分钟。

我需要找到一种更快的方法来做到这一点,但无法弄清楚。

关于重复项:听起来很奇怪,但是对于我的程序,如果它们具有相同的“名称”但在我需要的其他属性中可能具有不同的值,则它们是相等的。

4

1 回答 1

0

不了解名称相等的所有原因,但不了解值.. 甚至不了解列表 A 是否具有“foo”,如果您想保留所有“foo”,列表 B 是否具有 2x“foo”。 ..

这是一个想法.. 为同名对象数组创建一个“名称”的 HashSet ......现在您可以使用 retainAll 然后从哈希集值快速重建原始集合。

于 2020-02-29T22:53:25.413 回答