1

次の TreeMap があります。

TreeMap<String, Integer> distances = new TreeMap<String, Integer>();

また、次のような適切な値を持つ文字列「Face」と「Foo」の両方が含まれています。

System.out.println(distances); 

収量:

{Face=12, Foo=2}

ただし、正しくは 2 をdistances.get(Face)返しますがnull、 をdistances.get(Foo)返します。以前は動作distances.get(Face)していましたが、何らかの理由で動作しなくなりました。両方のキーに対して get() を呼び出す直前にマップを出力することに注意してください。そのため、Face の値を誤って null に変更することはありませ。他の誰かがこの問題に遭遇したことがありますか? 何か私にできることはありますか?この問題をデバッグする方法を見つけようとしているだけで、ひどい時間を過ごしています。

注: 実際のコードでは、実際には文字列を使用していませんが、別のオブジェクトを使用しているため、:TreeMap<Object, Integer>です。したがって、変数名とリテラル文字列の単なる混乱ではありません。

hashcode()2 番目の注意: また、equals()使用しているオブジェクトの実装についても、かなりの自信を持っています。(また、私の実装が正しくなければ、最初から機能しないのではないでしょうか?ランダムに動作を停止するのではなく?)

4

5 に答える 5

5

あなたのメモに応えて:誰もがあなたがオーバーライドequals()してhashcode()適切に行ったかどうかを尋ねています-これは重要です、はい。ただし、これは、TreeMap比較にも注意する必要があることを意味します。Comparableオブジェクトを使用している場合でも外部を使用している場合でもComparator、比較が一貫していること(オブジェクトは変更可能ですか?)、およびそれらが一貫していることを確認する必要があります。あなたのequals()方法。

ちなみに、元の質問でStringオブジェクトを使用していると言ったとき、あなたは自分自身に不利益をもたらしました。文字列は不変であり、それらの比較方法はここでは考慮されていないため、質問は根本的に異なります。独自のコードが含まれていることがわかったので、可能なソリューションの分野はより広くなりました。

于 2010-04-21T03:42:20.067 に答える
0

"Face"文字列リテラルをという変数と混同していませFaceんか?文字通りを使用している場合、それdistances.get(Face)は変数を渡そうとしていることを意味し、戻ってFaceきても驚くことではありません(それが以前にマップにコンテンツを追加しnullたString変数でない限り)。

代わりに試してくださいdistances.get("Face")。それが機能する場合、それは"Face"あなたがキーとして使用している文字列であることを意味します-それはFace文字列を含むかもしれない変数と同じではありません。

于 2010-04-21T03:09:37.693 に答える
0

@smessingは、オブジェクトFooとFaceが属するクラスに適切に実装equalsし、メソッドを実行しましたか?hashcodeオブジェクトをリスト、マップ、またはセットに格納する場合は、ドキュメントで指定されている標準のコントラクトに従うように、equalsとhashCodeを実装する必要があります。これらが適切に行われない場合、get操作は、あなたが述べたように予期しない結果をもたらす可能性があります。

于 2010-04-21T03:20:29.303 に答える
0

「Foo」と「Face」の値がどちらも であると確信していますStringsか?

このコードは私のために働きます:

        TreeMap<String, Integer> map = new TreeMap<String, Integer>();
        map.put("a", 1);
        map.put("b", 2);

        System.out.println(map);
        System.out.println(map.get("a"));
        System.out.println(map.get("b"));

{a=1, b=2} 1 2 を出力します。

あなたの場合、FooFaceが両方ではない場合String、マップはそれらをルックアップのキーとして使用できません。たぶん、使用get(Face)すべき場所を使用していますget("Face")か?

于 2010-04-21T03:03:39.480 に答える
0

Face に他の参照オブジェクト/変数を割り当てている場合は、それが null になっているかどうかを確認してください。

顔オブジェクトが別のオブジェクトの参照を指していて、別のオブジェクトがそれを null に設定している場合、Face も null になります。

于 2010-04-21T04:36:37.313 に答える