更新: 我修改了hashCode,现在好一点了。 :)但问题仍然存在...... :(
所以,并修改了我的方法:
private Node getMinNode()
{
int min = 9999999; //value
Node minNode = new Node(); //key,index
for (Node key : this.distances.keySet()) {
int minOfNode= this.distances.get(key);
System.out.println("Key "+ key +", Value = " + minOfNode);
if(minOfNode<min)
{
min= minOfNode;
minNode= key;
System.out.println("Key minNode = " + minNode + ", Value minNode = " + minOfNode);
}
}
return minNode;
}
并且有输出:(行中的空格(,)将是一个空字符),这不是结束......这只是前几行......
Key 66601, 3546492, 3546493, 228, f, Value = 9999999
Key 77393, 3628185, 3628186, 64, t, Value = 9999999
Key 0, 0, 0, 0, , Value = 0
Key minNode = 0, 0, 0, 0, , Value minNode = 0
Key 66601, 3546492, 3546493, 228, f, Value = 9999999
Key 77393, 3628185, 3628186, 64, t, Value = 9999999
(注意:'Key 0,0,0,0,Value = 0'的元素确实存在,这是startNode) 在那个构造函数中,attribs用零初始化,我知道, 所以我的主要问题是,为什么会发生这种情况?它们从if()传递出来,但在if()中它们不是 我希望它更清楚我的问题是什么。 :)
答案 0 :(得分:1)
首先存储min和minNode - 不是很好的做法,它们不是必需的。
接下来,将整个Map传递给方法比使用全局变量更好(如果你不知道它就是cource)
Map.keySet() - 返回一个键列表,好像你需要Map.getEntrySet()方法来检索所有'节点'(在通常的Map中它们被称为Entry)
你的代码应该是这样的:
private Map.Entry getMinNode(Map<String, Integer> distances) {
Map.Entry minNode = null;
for (Map.Entry node : distances.entrySet()) {
System.out.println("Key = " + node.getKey()+ ", Value = " + node.getValue());
if (minNode == null || node.getValue() < minNode.getValue()) {
minNode = node;
}
}
return minNode;
}
你应该看看JavaDoc http://docs.oracle.com/javase/6/docs/api/java/util/Map.html
答案 1 :(得分:1)
首先,@ StrekoZ部分正确。如果您遍历entrySet,则无需调用get(key)
。
但我不确定是什么原因引起了你的问题。几个理论:
地图中存储的距离值确实为零;即问题出在任何创建条目的地方。
您的Key
课程未正确实施equals(Object)
和hashCode()
。
您的Key
个对象是可变的,而某些东西正在改变它们在地图中的哈希码值的方式。
最后两个可能导致密钥显示在keySet中,但是当你get
使用它们时会丢失。
更新 - 您更新的问题中的输出与我的第一个理论最为一致;即地图中的距离值不正确。