【问题标题】:Using a HashMap as a Key for another HashMap使用 HashMap 作为另一个 HashMap 的键
【发布时间】:2017-07-06 17:59:57
【问题描述】:

我有一个要求,我需要用一组值映射一组配置,最好用Map<Map<String, Object>, Map<String, Object>> 结构表示。

主地图的配置和值部分都是任意的,因此我无法使用具体的类。

请提供有关此结构的一些反馈。一个 Map 可以用作另一个 Map 的键吗?通过一些研究,我能够确定 Map 的 equals 方法利用所有底层键和值来将两个 Map 视为相等。此外,Map 的 HashCode 是基于 Map 的 Keys 的 Hashcode。这个 IMO 应该足以满足使用 Map 作为键的最低要求。

在我继续实施之前,我仍然希望有人对此进行验证。如果有人可以建议更好的解决方案/设计,请随时这样做。

编辑

我最终使用了一个简单的波浪号 ('~') 和管道 ('|') 分隔的字符串作为键,并在需要时解构它。感谢所有帮助过的人。

【问题讨论】:

  • 你没有这个要求。你只是认为你做了。
  • 您可能会以某种方式将其破解,但我认为您应该退后一步并 100% 确定您不能使用 String 或 Pojo 作为密钥。
  • 组合地图是一个线索,您应该创建一些单独的类。
  • "我最终使用了一个简单的波浪号 ('~') 和竖线 ('|') 分隔的字符串" 字符串类型的键让我很难过 :'( - if您有结构化数据,使用结构化类型(即专用键类型),不要将该结构分解为字符串。`@AutoValue 可以很容易地快速定义此类类型。

标签: java collections hashmap


【解决方案1】:

是的,HashMap 可以用作另一个映射的键,因为该类正确地覆盖了 .equals().hashCode()

但是,广义上讲,bad idea to use mutable types(例如HashMap)作为Map 键或Set 元素,因为如果对象在集合中发生突变,则您违反了这些类所期望的不变量。

虽然不是您想要的,但Guava 提供了几个additional data structures,例如MultisetMultiMapBiMapTable,它们可能很有用。他们还提供immutable collections,例如ImmutableMap(因为它们不能被变异)用作Map 密钥更安全。这并不是说您应该这样做,只是因为它是安全的(如果键和值也是不可变的)。

考虑发布一个问题来探索导致您得出结论Map<Map<K, V>, Map<K, V>> 结构是您所需要的。 那个问题你可能会得到更好的答案。

【讨论】:

  • 这很有意义。我完全忽略了不变性。将研究不可变集合。
  • @Sumit,很高兴为您提供帮助,但也请考虑替代数据结构 - 嵌套映射通常是代码异味,很快就会变得难以使用。
猜你喜欢
  • 2020-04-09
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多