2017-02-17 53 views
4

我有一个需求,我需要将一组配置映射到一组值,理想情况下用Map<Map<String, Object>, Map<String, Object>>结构表示。使用HashMap作为另一个HashMap的关键字

这两个配置&主Map的值部分是任意的&因此,我无法使用具体的类。

请提供一些关于此结构的反馈。地图可以用作另一个地图的关键字。做了一些研究后,我能够确定Map的等号方法利用所有底层的Keys值将两个地图视为相等。另外,Map的HashCode基于Map的Keys的HashCode。 IMO应该满足使用地图作为关键的最低要求。

在继续执行之前,我仍然希望有人验证这一点。如果有人可以提出更好的解决方案/设计,请随时这样做。

EDIT

我结束了使用简单的代字号( '〜')&管( '|')分隔的字符串作为关键&解构它在需要时。感谢所有的帮助。

+6

您没有这个要求。你只认为你这样做。 – Raedwald

+0

你可能会以某种方式将它拼凑在一起,但我认为你应该退一步,并100%确定你不能使用String或Pojo作为关键。 –

+2

构图地图的地图是你应该创建一些单独的类的线索。 –

回答

16

是的,HashMap可以被用来作为重点另一个地图,作为类正确覆盖.equals().hashCode()

但是它从广义上讲一个bad idea to use mutable types(如HashMap)作为Map键或Set元素,因为你违反了不变,如果对象而征收的突变这些类的期望。

MultisetMultiMapBiMapTable这可能是有用的虽然不是你要找比较什么,Guava提供了几种additional data structures。他们还提供immutable collections,如ImmutableMap哪些(因为它们不能被突变)更安全地用作Map密钥。这不是说你应该这样做,只是它是安全的(如果键和值也是不可变的)。

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

+0

这很有道理,我完全忽视了不变性,将研究不可变的集合 – Sumit

+0

@Sumit,很高兴提供帮助,但也请考虑其他数据结构 - 嵌套地图通常是代码味道,并且可能很快变得难以工作用。 – dimo414