找到两个数据集之间差异的有效方法

时间:2013-12-29 13:37:21

标签: java data-structures collections guava

我有两份数据副本, 1 代表我的卷, 2 代表我的问题。我必须将 COPY2 COPY1 进行比较,找到 COPY2 中缺少的所有元素( COPY1 将始终为超集和 COPY2 可以相等或永远是子集。 现在,我必须在COPY2中获得缺失的卷和问题。 从下图(场景)我得到的结果为: - enter image description here

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

问题 -

  1. 我应该使用什么数据结构来存储上述值(卷和问题)?
  2. 我应该如何以最有效的方式在java中实现这个场景,以找到这两个副本之间的区别?

3 个答案:

答案 0 :(得分:2)

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

在这种情况下,您需要找到差异的是一个电话

copy1.removeAll(copy2);

copy1中遗漏的内容copy1中存在的所有问题以及copy2中遗漏的问题。

请注意,您的VolumeIssue课程必须正确实施equalshashCode才能实现此目的。

答案 1 :(得分:1)

由于您添加了Guava标记,我会选择Marco Topolnik's answer的变体。不要从另一个中删除一个集合,而是使用Sets.difference(left, right)

  

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

答案 2 :(得分:0)

  

我应该使用什么数据结构来存储上述值(卷和问题)?

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

key是Volume,Value是一个问题列表。

  

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

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

考虑从两张地图中获得两个具有相同键值的值列表。

现在

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