我在Processing.js中有一個遍歷HashMap的問題。在調用迭代器時,(it.hasNext())永遠不會輸入。Processing.js HashMap
作爲一個健全性檢查,我試圖跳過迭代器,而是將鍵轉換爲一個數組,並通過索引來遍歷這些鍵。那也行不通。我打印出來的情況如下:
myHashMap.size(); // outputs 4
myHashMap.keySet().size(); // outputs 4
myHashMap.keySet().toArray().length; // outputs 0
我希望最後一行也輸出4,因爲他們以前的電話一樣。我理解錯誤嗎?謝謝!
編輯
這裏是我運行到這個問題的一個完整的例子。原來是在我的HashCode中使用float的問題,但我仍然不明白爲什麼在將keySet轉換爲數組時會導致元素不匹配。
class Vertex {
float x;
float y;
public Vertex(float x, float y) {
this.x = x;
this.y = y;
}
public int hashCode() {
int hash = 17;
hash = ((hash + x) << 5) - (hash + x);
hash = ((hash + y) << 5) - (hash + y);
return hash
}
public boolean equals(Object obj) {
Vertex other = (Vertex) obj;
return (x == obj.x && y == obj.y);
}
}
HashMap<Vertex, String> tmp = new HashMap<Vertex, String>();
Vertex a = new Vertex(1.1, 2.2);
Vertex b = new Vertex(1, 1);
tmp.put(a, "A");
tmp.put(b, "B");
println("1, " + tmp.size()); // outputs 2
println("2, " + tmp.keySet().size()); // outputs 2
println("3, " + tmp.keySet().toArray().length); // outputs 1
請發表[MCVE],顯示我們,正是你正在運行的代碼。請注意,這應該只是幾行,對於我們複製和粘貼以獲得相同的結果足夠了,但不是您的整個草圖! –
這段代碼適用於我:'HashMap map = new HashMap (); 012.map.put(「one」,「A」); map.put(「two」,「B」); map.put(「three」,「C」); println(map.size()); println(map.keySet()。toArray()。length);' –
啊,謝謝Kevin!對不完整的例子感到抱歉。你的反應讓我從較低的層面進行調試。我的問題原來是我的HashMap中的鍵是對象,並且我爲這些對象創建的hashCode由於錯誤地使用了float而失敗。我仍然不明白爲什麼調用keySet()。size()和keySet()。toArray()。length會產生不同的值。我會發佈一個更新的代碼示例,以及我真正遇到的情況,以防有人感興趣。再次感謝! – megabits