0

更新:我修改了 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)在该构造函数中,属性用零初始化,我知道,所以我的主要问题是,为什么是这样吗?它们是从 if() 中传递出来的,但是在 if() 中它们不是我希望更清楚我的问题是什么。:)

4

2 回答 2

1

首先,@StrekoZ 部分正确。如果您遍历 entrySet,则无需调用get(key).

但我不确定是什么导致了你的问题。几个理论:

  • 存储在地图中的距离值实际上为零;即问题在于创建条目的任何内容。

  • 您的课程Key没有正确实施。equals(Object)hashCode()

  • 您的Key对象是可变的,并且某些东西正在以某种方式改变它们,即在它们位于 map 时更改它们的哈希码值。

最后两个都可能导致键出现在 keySet 中,但在您get使用它们时会丢失。

更新- 您更新的问题中的输出与我的第一个理论最一致;即地图中的距离值不正确。

于 2013-02-12T14:05:08.887 回答
1

首先存储 min 和 minNode - 不是很好的做法,它们不是必需的。
接下来,将整个 Map 传递给方法比使用全局变量更好(当然,如果你真的不需要它)
Map.keySet() - 返回一个键列表,看起来你需要 Map.getEntrySet() 方法检索所有“节点”(在通常的地图中,它们被称为条目)

你的代码应该是这样的:

    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

于 2013-02-12T13:36:50.287 回答