我在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