Java ArrayList自定义类作为HashMap键

Java ArrayList自定义类作为HashMap键,java,hashmap,Java,Hashmap,我想将数据存储在HashMap中。我使用迭代来分配数据,但是当我在最后检查时,元素的数量只有1。我已经在自定义类点中实现了hashCode()和equals() HashMap<Point[], Double> hmDistOrd = new HashMap<Point[], Double>(); Point[] keyPts = new Point[2]; for (int i=0; i<intersectionPts.size(); i++) { p1 = i

我想将数据存储在
HashMap
中。我使用迭代来分配数据,但是当我在最后检查时,元素的数量只有1。我已经在自定义类点中实现了
hashCode()
equals()

HashMap<Point[], Double> hmDistOrd = new HashMap<Point[], Double>();
Point[] keyPts = new Point[2];

for (int i=0; i<intersectionPts.size(); i++) {
p1 = intersectionPts.get(i);
    for (int j=0; j<intersectionPts.size(); j++) {
        p2 = intersectionPts.get(j);                
        if (!p1.equals(p2)) {
            keyPts[0] = p1;
            keyPts[1] = p2;
            d = p1.distance(p2);
            hmDistOrd.put(keyPts, d);
        }
    }
}
HashMap hmDistOrd=newhashmap();
点[]关键点=新点[2];

对于(int i=0;i不能使用数组作为关键字,因为数组默认地实现了<代码> hash码< /COD>和<代码>等于<代码> > <代码>对象< /代码>,并且不考虑它的元素。 要使其工作,您必须重写数组的
hashCode
等于,但您不能这样做


您可以使用<代码> ARAYLIST < /C>,因为它实现了<代码> HASCODE < /代码>结束<代码>等于比较元素。

不能使用数组作为键,因为数组默认地实现了<代码> hash码< /COD>和<代码>等于<代码> > <代码>对象< /代码>,并且不考虑它的元素。 要使其工作,您必须重写数组的

hashCode
等于,但您不能这样做


您可以使用
ArrayList
,因为它实现了
hashCode
end
equals
比较元素。

在每次迭代时,您都将相同的数组实例keyPts存储到HashMap中(并覆盖其内容)


对于您的特定情况,我将尝试使用映射映射:
map
或具有两个键和一个值的自定义2D矩阵类。

当您使用数组作为哈希映射的键时,用于确定键的哈希而不是点类的数组哈希代码方法

对于您的具体情况,我将尝试使用地图地图:
map
或具有两个键和一个值的自定义2D矩阵类。

正如Jim在其(已删除)回答中所说,您将同一个键对象多次放入地图,这将导致替换以前的值

但是,为每个元素放置一个新数组也不会更好——这样您将有更多的键值对,但是如果您没有正确的数组对象(然后您也可以有值),您就无法通过
get
方法访问它们,因为数组没有实现
。equals
hashCode

建议解决方案:您可以使用
列表
作为密钥类型,并为每对关键点使用一个新列表。确保在将列表作为密钥放入地图后不会修改该列表。(您可以通过集合包装它。不可修改列表以确保这一点。)

另一种选择是一些定制的点对类(具有自己的hashCode和equals实现)。

正如Jim在(已删除的)回答中所说的,您在映射中多次放置相同的键对象,这将导致替换以前的值

但是,为每个元素放置一个新数组也不会更好——这样您将有更多的键值对,但是如果您没有正确的数组对象(然后您也可以有值),您就无法通过
get
方法访问它们,因为数组没有实现
。equals
hashCode

建议解决方案:您可以使用
列表
作为密钥类型,并为每对关键点使用一个新列表。确保在将列表作为密钥放入地图后不会修改该列表。(您可以通过集合包装它。不可修改列表以确保这一点。)


另一种选择是一些定制的点对类(具有自己的hashCode和equals实现)。

使用集合而不是数组。这很简单。将map更改为
map
并使用
Arrays.asList()
从数组中填充。哦,我刚刚意识到我将键声明为数组。太傻了。让我先编辑它,看看它是否有效。使用集合而不是数组。这很简单。将map更改为
map
并使用
Arrays.asList()
从数组中填充。哦,我刚刚意识到我将密钥声明为数组。太傻了。让我先编辑它,看看它是否有效。