2011-07-21 93 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