2012-06-23 60 views
-1

我想在数组中使用一个数组作为HashMap中的键。数组的长度是两个,所以本质上是一个2元组。实现一个自定义的2元组是最后一招。问题是,我希望具有相同内容的数组映射到HashMap中的不同位置(如果它们具有不同的内存位置)。我知道Arrays.hashCode和Arrays.deepHashCode中有hashCode函数,但是有什么方法可以将它们用于HashMap。正如我已经说过的,我真的不想实现我自己的元组类。使用数组作为散列图键

+0

前段时间我遇到了大致相同的问题,放弃了。我不认为你可以改变原始数组的哈希行为。为此,你有一个很好的例子来介绍一个新的'SerializableTuple'类。 – Gene

回答

0

好吧我找到了解决方案。而不是使用数组,我用List代替。这是有效的,因为List通过内容确定了平等,而不是通过引用。

3

我会不是推荐这种方法。

键必须是不可变的。除非你制作阵列,否则将会充满危险。

Java的一种面向对象的语言。我认为从原始角度思考太多是错误的。封装您在对象中需要的正确行为。

为什么要创建自己的班级如此压抑?最后一招?我不明白为什么这是一件大事。创建它,使其不可变,清晰地记录你的意图,然后继续。

更新:我不会让你已经有一个有缺陷的元组类的事实阻止你在这种情况下做正确的事情。你说你有“数百班” - 我说再做一件事情不会让你失望。通过积累“实际”的错误决策,代码最终会变得混乱,就像你将要做的那样。通过为这个狭窄问题创建正确的解决方案,解决问题并不会增加问题,并开始从那里找出更好的答案。

+0

我们已经有了一个元组实现,但它不能被我们的序列化器序列化,而且我需要将这些信息序列化。我不会重复功能,我们的元组实现是我们项目的主要数据结构之一,它跨越了数百个类。 – Max

+0

这里的正确解决方案是吸取它并编写新的Pair类,或者甚至更好地编写一个具有更具体名称和特定字段名称的类。当不同的元素具有不同的含义时,不应该使用数组。即使在这里有一些使用'Arrays.equals'或'Arrays.hashCode'的方法 - 没有 - 写一个新的类将是这里唯一正确的解决方案。 –

+1

@Max - 简单的解决方案是改变现有的(不可变的)元组类型以使其可序列化。这有什么风险?使你的元组类可序列化不能破坏现有的代码,不会尝试序列化元组... –

1

问题是,我想要具有相同内容的数组映射到HashMap中的不同位置(如果它们具有不同的内存位置)。

如果阵列具有不同的存储位置,或者如果内容的阵列的具有不同的存储位置?如果是前者,则可以使用IdentityHashMap而不是普通的HashMap。但是,如果是后者,那么我非常赞同@ duffymo的回答:grow a pair;)