2011-07-21 139 views
0

我想将我的数据存储在HashMap<Point[], Double>中。我使用迭代来分配数据,但是当我在最后检查时,元素的数量仅为1.我已在自定义类Point中实现了hashCode()equals()ArrayList自定义类作为HashMap键

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); 
     } 
    } 
} 

任何提示?提前致谢!

回答

4

您不能使用数组作为关键字,因为数组的默认实现为hashCodeequalsObjects并且它不认为它是元素。

为了使它工作,你必须覆盖数组的hashCodeequals,但你不能这样做。

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

+1

使用集合而不是数组。这很容易。将地图更改为'Map ,Double>'并使用Arrays.asList()从数组中填充它。 – AlexR

+0

哦,我刚刚意识到我把密钥声明为Array。多么愚蠢。让我先编辑它,看看它是否有效。 – springrolls

+0

@AlexR:谢谢!它现在有效。 – springrolls

1

要存储在相同的阵列实例,keyPts,进HashMap中在每个迭代上(和覆盖它的内容以及)。

0

当你使用一个数组作为一个哈希表的关键它是被用来确定键的哈希,而不是你点类数组的hashCode方法。

针对您的特殊情况下,我会尝试使用地图的地图:Map<Point, Map<Point, Double>>或2个键和值自定义二维矩阵类。

1

吉姆说他(删除)的答案,你是把同一个密钥对象多次在地图上,这将导致替换以前的值。

但是为每个元素添加一个新的数组也不会更好 - 那么您将拥有更多的键值对,但是如果您没有正确的方法,则无法通过get方法访问它们数组对象(然后您也可以拥有该值),因为数组不会实现.equalshashCode

提出对策:你可以使用一个List<Point>您的主要类型,并使用新的列表每一对关键点。确保在将其作为关键字放入地图后不要修改列表。 (您可以通过Collections.unmodifiableList包裹它,以确保这一点。)

另一种方法是一些自定义成对的点类(与它自己的hashCode和equals实现)。

+0

+1将所有东西放在一起。谢谢! – springrolls