【问题标题】:Efficient data structure to hold/add/remove duplicate items有效的数据结构来保存/添加/删除重复项
【发布时间】:2016-04-24 13:46:54
【问题描述】:

我有 2 个来源可以从中读取数据。该数据可能是重复的,我需要通过相互减去 2 个集合来检测这些重复项。 目前,我使用List<Map<String, String> duplList,所以当我插入重复值时:

Map<String, String> map1 = new HashMap();
map1.put("1", "1");
map1.put("1", "1");
map1.put("1", "1");
duplList.add(map1);

Map<String, String> map2 = new HashMap();
map2.put("1", "1");
map2.put("1", "1");
duplList.add(map2);

然后再减去它们:

Collection diff1 = CollectionUtils.subtract(map1, map2);
Collection diff2 = CollectionUtils.subtract(map2, map1);

我得到一个包含 map1 和 map2 之间差异的对象。
虽然这可行,但对我来说似乎效率不高(因为它在 O(n) 时间内运行)。

我想知道是否有一种更有效的方法可以将数据添加到更有效的数据结构中并从中减去。

【问题讨论】:

  • 如何定义重复项?重复的键或键值对?另外,找到重复项后如何解决冲突?
  • 如果我理解正确,您可以使用 add 方法将“可复制”对象添加到 Set。如果使用对象调用 add 返回 false 则该对象是重复的,因此将其存储到单独的集合中。
  • @SergeiLebedev Duplicates 被定义为相同的 key-value paris,所以 "1"->"1" 是重复的,但 "1"->"2" 不是。
  • 如果“差异”是指您想要一个未出现在 both 集中的项目列表,那么您能做的最好的事情就是 O(n)。一些数据结构会比其他数据结构更有效,这会减少常数因子,但渐近地说,你不能做得比 O(n) 更好。

标签: java data-structures memory-efficient


【解决方案1】:

如果您只想将数据放在未排序的集合中,您可以使用HashSet,如果您希望对其进行排序,您可以使用TreeSetTreeSet 需要一个实现 Comparable 的类——如果你只使用字符串或整数,你应该没问题。您可以在Java Doc: Set找到更多信息

【讨论】:

  • 我没有提到我的数据必须是键值对格式。将它存储在 Set> 中会比 List> 更有效吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多