Java 在数据结构中重复插入时返回对象?

Java 在数据结构中重复插入时返回对象?,java,data-structures,Java,Data Structures,我目前正在将对象插入哈希集(节点插入图形)。每当我插入一个副本,我就会得到错误的返回。这是很好的反馈,但我更愿意看到返回的对象,这样我就可以使用它了。现在我可以想出以下任何一个: 插入对象,如果它是重复的,则在集合上迭代并再次比较以检索对象。所以效率很低 首先迭代它,当它唯一时插入,否则编辑集合中的对象。就我的目的而言,这甚至效率更低,因为我预计不会有太多的副本 我错过什么了吗 我可以使用映射,并对键和值使用相同的对象。但这可能会使用更多的内存然后设置?但我仍然缺少地图的功能hashMap.

我目前正在将对象插入哈希集(节点插入图形)。每当我插入一个副本,我就会得到错误的返回。这是很好的反馈,但我更愿意看到返回的对象,这样我就可以使用它了。现在我可以想出以下任何一个:

  • 插入对象,如果它是重复的,则在集合上迭代并再次比较以检索对象。所以效率很低

  • 首先迭代它,当它唯一时插入,否则编辑集合中的对象。就我的目的而言,这甚至效率更低,因为我预计不会有太多的副本

我错过什么了吗

我可以使用
映射
,并对键和值使用相同的对象。但这可能会使用更多的内存然后设置?但我仍然缺少地图的功能
hashMap.put(key,value)
将始终返回值。那么,我如何知道值何时是重复的呢?在这个场景中,我仍然需要对要插入的每一对进行查找

所以也许我忽略了一个适合我需要的数据结构?我只想插入对象,并在重复条目上使用数据结构中已有的对象。既然如此,如果数据结构已经知道有一个副本,它也应该可以访问这个副本,我真的希望这个对象非常漂亮

  • 我真的需要数据中的对象,我有人说我已经有了对象,因为它是重复的。但是,如果我更改该对象,集合中的对象将不会更改

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

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


您的
地图想法可能适合您的需要

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

HashSet
是通过
HashMap
实现的,因此没有区别

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

如果没有映射,它将返回
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);
}

您对
Map
的想法可能适合您的需要

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

HashSet
是通过
HashMap
实现的,因此没有区别

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

如果没有映射,它将返回
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);
}

使用电视机似乎不是一个好办法。Set API针对检查元素是否在集合中(
包含
)和遍历(通过
迭代器
)进行了优化,但不用于元素检索

Map似乎更适合您的情况,因为您还可以快速检查元素是否存在,如果需要还可以检索元素。然而,使用同一个对象作为键和值似乎有点奇怪——难道你没有任何东西可以用作键吗?当您在编程图形时,节点不是有一个id或唯一标识它们的东西吗?用你提到的这些“坐标”作为键怎么样?这可能会给您带来更大的灵活性和更好的性能


顺便说一下,如果存在具有相同键的对象,则Map
put
方法返回旧对象,否则返回
null
。如果它对您有帮助,您可以检查对象在
放置之后是否在地图中,而不是在
放置之后检查对象是否在地图中,并采取措施将地图更正回其原始状态。

使用集合似乎不是一种可行的方法。Set API针对检查元素是否在集合中(
包含
)和遍历(通过
迭代器
)进行了优化,但不用于元素检索

Map似乎更适合您的情况,因为您还可以快速检查元素是否存在,如果需要还可以检索元素。然而,使用同一个对象作为键和值似乎有点奇怪——难道你没有任何东西可以用作键吗?当您在编程图形时,节点不是有一个id或唯一标识它们的东西吗?用你提到的这些“坐标”作为键怎么样?这可能会给您带来更大的灵活性和更好的性能


顺便说一下,如果存在具有相同键的对象,则Map
put
方法返回旧对象,否则返回
null
。如果它对您有帮助,您可以检查对象在
放置之前是否在地图中,而不是在
放置之后是否在地图中,并采取措施将地图更正回其原始状态。

如果没有重复,则该放置返回空值。现在我想知道是否应该从节点中删除坐标并将其用作键。如果没有重复项,put将返回null。现在我想知道是否应该从节点中删除坐标,并将其用作键。