返回数据结构中重复插入的对象?

时间:2015-12-17 18:52:54

标签: java data-structures

我目前正在将对象插入Hashset(节点插入图形)。每当我插入副本时,我都会返回false。这是很好的反馈,但我更愿意看到返回的对象,所以我可以使用它。现在我可以想出:

  • 插入对象,如果它是对集合的重复迭代,则再次进行比较以检索对象。效率非常低。

  • 首先迭代它并在它唯一时插入,否则编辑集合中的对象。为了我的目的,这个效率更低,因为我预计没有多少重复。

我错过了什么吗?

我可以使用Map<K,V>并使用相同的对象作为键和值。但这可能会使用更多内存然后设置?但我仍然缺少地图的功能。 hashMap.put(key, value)将始终返回值。那么我如何知道值何时重复?在这种情况下,我仍然需要对要插入的每对进行查找。

那么也许我忽略了一个适合我需求的数据结构?我只是想插入对象和重复的条目工作与数据结构中已有的对象。从afaik开始,如果数据结构已经知道有重复,那么它也应该可以访问这个副本,我真的非常喜欢那个对象。

  • 我确实需要数据中的对象,我有人说我已经拥有了该对象,因为它是重复的。但是如果我改变那个对象,那么集合中的对象就不会改变。

  • 别担心,我从坐标生成Hashcode,这些是最终的(不可变的)。我将向其添加与其他节点的连接,它们不会改变散列或排序顺序。

  • 我真的不想使用迭代器。数据结构包含单词hash的原因是有原因的。通过使用树查找和其他我不应该谈论的东西,它们的工作速度要快得多,因为我对它不够了解。

2 个答案:

答案 0 :(得分:2)

Map的想法可能符合您的需求。

  

我可以使用Map并使用相同的对象作为键和值。   但这可能会使用更多内存然后设置?

HashSet是通过HashMap实施的 - 因此没有区别。

  

但我仍然缺少地图的功能。 hashMap.put(键,   value)将始终返回值。

如果没有映射,它将返回null。因此,除非您需要存储空值,否则可以像这样实现它:

T duplicate = map.put(newValue, newValue);
if (duplicate != null) {
    map.put(duplicate, duplicate); // if you need old object in case of duplicate
    processDuplicate(newValue, duplicate);
}

答案 1 :(得分:1)

使用套装似乎不是最佳选择。 Set API已经过优化,可以检查元素是否在集合中(contains)和遍历(通过Iterator),但不能用于元素检索。

Map似乎更适合您的情况,因为您还可以快速检查元素是否存在,并在需要时检索元素。但是,使用相同的对象作为键和值似乎有点奇怪 - 难道你没有任何可以用作键的东西吗?在编写图形时,节点是否具有唯一标识它们的ID或其他内容?如何使用您提到的这些“坐标”作为关键?这可以为您提供更大的灵活性和更好的性能。

顺便说一下,如果某个对象具有相同的键,则Map put方法将返回旧对象,否则返回null。如果它对您有所帮助,而不是在put之前检查某个对象是否在地图中,您可以在 put之后检查对象是否在那里并执行某些操作将地图更正回原始状态。