2

私は次のオブジェクトを持っていますNode:

    private class Node implements Comparable<Node>(){
         private String guid();

         ...

         public boolean equals(Node o){
             return (this == o);
         }

         public int hashCode(){
              return guid.hashCode();
         }

         public int compareTo(Node o){
            return (this.hashCode() - o.hashCode());
         }

         ...

    }

そして、私はそれを次のように使用しますTreeMap:

TreeMap<Node, TreeSet<Edge>> nodes = new TreeMap<Node, TreeSet<Edge>>();

現在、ツリー マップは、Graph現在グラフ内にあるノードとそのエッジのセットを ( クラス からEdge) 格納するために呼び出されるクラスで使用されます。私の問題は、実行しようとするときです:

   public containsNode(n){
        for (Node x : nodes.keySet()) {
            System.out.println("HASH CODE: ");
            System.out.print(x.hashCode() == n.hashCode());
            System.out.println("EQUALS: ");
            System.out.print(x.equals(n));
            System.out.println("CONTAINS: ");
            System.out.print(nodes.containsKey(n));
            System.out.println("N: " + n);
            System.out.println("X: " + x);
            System.out.println("COMPARES: ");
            System.out.println(n.compareTo(x));
            }
        }

私は時々次のようになります:

HASHCODE: true EQUALS: true CONTAINS: false N: foo X: foo COMPARES: 0

誰が私が間違っているのかについて考えを持っていますか? 私はまだこれらすべてに慣れてhashCode()いないので、簡単なことを見落としている場合は事前にお詫びします ( TreeMap.

edit1:compareTo()メソッド情報を追加しました。

4

3 に答える 3

5

ここにはいくつか問題があります。

  • をオーバーライドしていませんObject.equals。を使用し@Override public boolean equals(Object obj)ます。
  • に潜在的な整数オーバーフロー エラーがありcompareToます。これがおそらくこの特定のエラーの原因です。並べ替えが混乱するため、検索がうまくいかない可能性があります。
  • このcompareToメソッドは、ハッシュ コードがたまたま一致した場合、2 つのインスタンスが等しいと主張します (コードを確認しないと、キャッチするのが難しいエラーになる可能性があります)。

整数オーバーフローの問題については、質問「単純なコンパレータが壊れているのはなぜですか?」を参照してください。

于 2010-04-22T21:30:02.877 に答える
5

TreeSet は equals() を使用して等しいかどうかを判断しません。代わりに Comparator (または Comparable) を使用します。正しく機能させるには、等しい規則との一貫性に従う必要があります。

「一連の要素 S にコンパレータ c によって課される順序付けは、c.compare(e1, e2)==0 が e1.equals(e2) と同じブール値を持つ場合にのみ、equals と一致すると言われます。 S" の e1 と e2。

このルールに従っていないと思います (compareTo メソッドの実装を提供していません)。ルールに従わない場合、ツリー セットはセットの通常の動作を持ちません。

詳細については、http://eyalsch.wordpress.com/2009/11/23/comparators/を参照してください。

- 編集 -

compareTo 実装を提供したので、欠陥があることは明らかです。等しくない (そして同じハッシュコードを持つ) 2 つのノードに対して 0 を返す場合があります。この結果、同じハッシュ コードを持つ 2 つのアイテムを TreeSet に追加することはできません。

于 2010-04-22T21:19:42.133 に答える
0

コンパレータを確認してください。

コンパレータに依存する可能性のあるcontainsKey()呼び出し。getEntry()壊れていると、一貫性のない結果が予想されます。

于 2010-04-22T21:18:57.033 に答える