答案 0 :(得分:4)
您不能将数组用作键,因为数组具有来自hashCode
的默认实现equals
和Objects
,并且它不会考虑它的元素。
要使其工作,您必须覆盖数组的hashCode
和equals
,但您无法做到。
您可以使用ArrayList
,因为它会实现hashCode
结束equals
比较元素。
答案 1 :(得分:1)
您在每次迭代时都将相同的数组实例keyPts存储到HashMap中(并覆盖其内容)。
答案 2 :(得分:1)
正如Jim在他的(删除)答案中所说,你在地图中多次放置相同的关键对象,这将导致替换之前的值。
但是为每个元素添加一个新数组也不会更好 - 那么你将拥有更多的键值对,但是如果你不能通过get
方法访问它们拥有正确的数组对象(然后你也可以得到这个值),因为数组没有实现.equals
和hashCode
。
提出解决方案:您可以使用List<Point>
作为密钥类型,并为每对关键点使用新列表。将其作为键放入地图后,请确保不要修改列表。 (您可以通过Collections.unmodifiableList将其包装起来以确保这一点。)
另一种选择是自定义的一对点类(使用自己的hashCode和equals实现)。
答案 3 :(得分:0)
当您使用数组作为哈希映射的键时,该数组的hashCode方法用于确定键的哈希值,而不是您的Point类。
对于您的具体情况,我会尝试使用地图地图:Map<Point, Map<Point, Double>>
或带有2个键和值的自定义2D矩阵类。