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 

(注:「キー0、0、0、0、、値= 0」の要素が存在します。これはstartNodeです)そのコンストラクターでは、属性がゼロで初期化されていることがわかっているので、私の主な問題は、なぜそれは起こっていますか?それらはif()から直接渡されますが、if()ではそうではありません。私の問題がより明確になることを願っています。:)

4

2 に答える 2

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;
}

JavaDochttp://docs.oracle.com/javase/6/docs/api/java/util/Map.htmlを確認する必要があります

于 2013-02-12T13:36:50.287 に答える
1

まず、@StrekoZ は部分的に正しいです。entrySet を反復処理した場合、 を呼び出す必要はありませんget(key)

しかし、何があなたの問題を引き起こしているのかわかりません。いくつかの理論:

  • マップに格納されている距離値は実際にはゼロです。つまり、エントリを作成しているものに問題があります。

  • あなたのクラスは正しく実装さKeyれていません。equals(Object)hashCode()

  • あなたのオブジェクトは変更可能であり、マップ内にある間にKeyハッシュコード値を変更する方法で何かがそれらを変更しています。

最後の 2 つは、キーが keySet に表示される可能性がありますが、キーをget使用すると失われる可能性があります。

更新- 更新された質問の出力は、私の最初の理論と最も一致しています。つまり、マップの距離値が正しくありません。

于 2013-02-12T14:05:08.887 に答える