【问题标题】:Efficient way to find the difference between two data sets找出两个数据集之间差异的有效方法
【发布时间】:2014-01-16 12:29:56
【问题描述】:

我有两份数据,这里 1 代表我的数量,2 代表我的问题。我必须比较 COPY2COPY1 并找到 COPY2 中缺少的所有元素(COPY1 将始终是超集和 COPY2 可以相等或始终是子集)。 现在,我必须在 COPY2 中获取丢失的卷和问题。 这样从下图(场景)我得到的结果是: -

缺少文件 - 1-C、1-D、2-C、2-C、3-A、3-B、4、E。

问题-

  1. 我应该使用什么数据结构在 java 中存储上述值(volume 和 issue)?
  2. 我应该如何以最有效的方式在 java 中实现这个场景以找出这两个副本之间的差异?

【问题讨论】:

  • 请更改您的标题,因为它反映了您的问题。当前标题太模糊。

标签: java data-structures collections guava


【解决方案1】:

我建议一个公寓HashSet<VolumeIssue>。每个VolumeIssue 实例对应一个分类问题,例如1-C

在这种情况下,您只需打个电话就能找到不同之处

copy1.removeAll(copy2);

copy1 中剩下的就是copy1 中存在的所有问题以及copy2 中缺少的所有问题。

请注意,您的 VolumeIssue 类必须正确实现 equalshashCode 才能正常工作。

【讨论】:

    【解决方案2】:

    既然你已经添加了 Guava 标签,我会选择Marco Topolnik's answer 的变体。不要从另一组中删除一组,而是使用Sets.difference(left, right)

    返回两组差异的不可修改视图。这 返回的集合包含 set1 包含的所有元素,而不是 由 set2 包含。 set2 也可能包含 set1 中不存在的元素; 这些都被忽略了。返回集的迭代顺序 与 set1 匹配。

    【讨论】:

      【解决方案3】:

      我应该使用什么数据结构在 java 中存储上述值(volume 和 issue)?

      您可以拥有一个带有键值对的 HashMap。

      key 是 Volume,Value 是 Issue 列表。

      我应该如何以最有效的方式在java中实现这个场景来找到这两个副本之间的差异?

      通过从两个 HashMap 中获取值,您可以获得两个 List 的值。然后找出这两个列表之间的区别。

      假设您从两个映射中获得了两个具有相同键的值列表。

      现在

        Collection<Issue> diff =  list1.removeAll( list2 );
      

      【讨论】:

      • 您不必必须拥有 HashMap,这只是一种选择。
      猜你喜欢
      • 2015-08-22
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2014-01-05
      • 2019-01-20
      • 1970-01-01
      • 2016-09-18
      相关资源
      最近更新 更多