【问题标题】:Is it possible to implement a MyHashMap backed by a given HashSet implementation?是否可以实现由给定 HashSet 实现支持的 MyHashMap?
【发布时间】:2014-01-23 07:06:33
【问题描述】:

众所周知,在 Sun(Oracle) JDK 中,HashSetHashMap 支持实现,以重用复杂的算法和数据结构。 但是,是否可以使用java.util.HashSet 作为其背面来实现MyHashMap? 如果可能,怎么做?如果不是,为什么?

请注意,本题仅讨论编码技巧,不适用于生产场景。

【问题讨论】:

  • HashMap 可以存储对,HashSet 可以存储单个元素,因此HashSetHashMapkeySet() 支持。如果你用HashSet 支持你的MyHashMap,你将在哪里存储值并有效地获取/设置它们?
  • 投票结束“主要基于意见”很奇怪..
  • 如果很容易达到目标,我不会把它称为编码技巧的讨论。看来我们对HashSet、HashMap等数据结构都很熟悉。所以想这个问题是为了好玩。不要被以前的经历所束缚。 @sanbhat
  • @sanbhat:正如 Peter 解释的那样,如果您可以检索现有元素,那么在集合中包含键/值对是完全可行的,其相等性由键。
  • @JonSkeet 同意.. 没想到 :)

标签: java data-structures hashmap hashset


【解决方案1】:

Trove 的 Map 是基于它的 Set 实现。但是,它有一个 Set 中缺少的关键方法,即 get() 方法。

如果没有 get(Element) 方法,HashSet 就无法执行查找,这是 Map 的关键功能。 (请原谅双关语)Set 的唯一选项是 contains,它可以被黑客入侵以执行 get(),但这并不理想。

你可以拥有;

  • 一个集合,其中条目是一个键和一个值。
  • 当键相同时,您将条目定义为相等。
  • 您破解了 equals() 方法,因此当存在匹配项时,在“放置”时更新条目的值部分,而在“获取”时复制值部分。

Set 本来可以设计为扩展为 Map,但事实并非如此,使用 HashSet 或现有的 Set 实现来创建 Map 也不是一个好主意。

【讨论】:

  • 如你所说,由于java.util.HashSetaddremovecontains方法只返回一个布尔值,我无法检索自定义集合Entry中的值,即使我破解了hashCodeequals 方法。所以用java.util.HashSet实现我想要的地图是不可能的。我说的对吗?
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 2022-08-17
  • 2014-03-05
  • 1970-01-01
  • 2010-11-03
  • 2021-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多