2012-03-05 30 views
2

HashMapデータ構造を使用してキーがMatrixIndex(行と列を含む)で、値がInteger型のSqMatrix(正方行列)を格納しています。 。java HashMap containsKeyはキーが存在するのにfalseを返しています

しかし、私は "if(mat.containsKey(key))"の出力としてfalseになっていますが、HashMapには対応するキーがあります。

メインコード:

public static void main(String[] args) { 

    Random generator = new Random(); 
    int val = 0; 
    Types.MatrixIndex key, key1; 
    int matSz = (int) Math.floor(Math.sqrt(10)); 
    Types.SqMatrix mat = new Types().new SqMatrix(matSz); //matSz*matSz elements 
    //HashMap<Types.MatrixIndex,Integer> hMap= new HashMap<Types.MatrixIndex,Integer>(10); 
    for (int r=0; r<matSz; r++) { 
     for (int c=0; c<matSz; c++) { 
      if (r<c) { 
       val = generator.nextInt(2) > 0? -1 : val; 
       key =(new Types()).new MatrixIndex(r, c); 
       key1 = (new Types()).new MatrixIndex(c, r); 
       mat.put(key, val); 
       mat.put(key1, val); 
       generator.setSeed(System.currentTimeMillis()); 
      } 
     } 
    } 

    for (int r=0; r<matSz; r++) { 
     val = 0; 
     for (int c=0; c<matSz; c++) { 
      if (r!=c) { 
       key = (new Types()).new MatrixIndex(r, c); 
       if (mat.containsKey(key)) { 
        val = val + mat.get(key); 
       } 

      } 
     } 
     key1 = (new Types()).new MatrixIndex(r, r); 
     mat.put(key1, val); 
    } 

誰もが、それはHashMapの中に存在しているものののcontainsKeyはfalseを返している理由についてのアイデアを持っていますか?事前に

おかげで、

+1

_accepted_ answer to http://stackoverflow.com/questions/1104030/java-hashmap-get-works-but-containskey-does-not助けてください'MatrixIndex'クラスに対して' equals() 'と' hashCode() 'を実装していないと思われるからです。 – andyb

+0

私は答えを受け取るためのリンクがありません。どんな手掛かりも返事を受け入れる方法? – somnathchakrabarti

答えて

6

私はMatrixIndexが何であるか分からないが、それはハッシュコードの実装がオーバーライドされていないのです場合、MatrixIndexのすべてのインスタンスは、それ自身のハッシュコードを持っており、ユニークな考えられています。したがって、containsKey()チェックを行うMatrixIndexの新しいインスタンスを渡すことはできません。

正確なコードスニペットを機能させるには、MatrixIndexクラスのequals()hashcode()をオーバーライドし、常にそのクラスの再現可能な一意の値を作成する必要があります。

これまでこれを行っていない場合は、これら2つの方法をオーバーライドしてください。クイック検索は多大な助けをもたらすでしょう。プロジェクトに新しいライブラリを追加できる場合は、次をご覧ください。http://commons.apache.org/lang/api-2.4/org/apache/commons/lang/builder/HashCodeBuilder.html

+0

リンクをご提供いただき、ありがとうございます。見て、知りましょう。 – somnathchakrabarti

4

Somnathは、あなたが(正確に)あなたのMatrixIndexクラスでequals()hashCode()を定義していますか?

+0

MatrixIndexクラスの実装を次に示します。 public class MatrixIndex implements equad { \t \t public int row; \t \t public int col; \t \t //...コンストラクタ、ゲッター、セッターなど \t \t @Override \t \t公共のintのcompareTo(MatrixIndex 0)はClassCastExceptionが{ \t \t \t // ...実装 \t \t} \t \tパブリックブール等しい(MatrixIndex MI){ \t \t \t場合(スローmI.getrow()== this.getrow()&& mI.getcol()== this.getcol()) \t \t \t \t return true; \t \t \t falseを返します。 \t \t} \t} – somnathchakrabarti

+0

私はhashCode()を追加していません。それに必要なものとその実装方法は何ですか? – somnathchakrabarti

+1

@somnathchakrabarti、 'equals()'の実装は間違っています。あなたは 'equals'への' Object'引数を受け入れなければなりません。 (そして、あなたはまだ 'hashCode'を実装する必要があります。) –

2

ほとんどの場合、MatrixIndex.hashCode()および/またはMatrixIndex.equals()を上書きするのを忘れた可能性があります。 Objectクラスから継承されたデフォルトのバージョンは、オブジェクトの内容ではなくオブジェクトのアイデンティティを比較し、あなたが期待していることをしません。成功するためcontainsKey()については

+0

Kosmulskiコメントにequals実装を掲載しました。しかし、hashCodeの実装についてはわかりません。良いhashCode関数は何ができますか?私はそれがcontainsKeyがまだfalseを返しているのではないかと思うので、 – somnathchakrabarti

+0

あなたが言及している 'hashCode()'のコードを見つけることができません。しかし、最も重要なことは、2つのオブジェクトインスタンスが 'equals()'で等しいとすると、同じハッシュコードも返さなければならないということです。 'MatrixIndex'に行と列がある場合は、' hashCode() 'で始めることができます。それらの和やrow + N * colを返すことができます.Nは比較的大きな素数です。 –

3

、二つのオブジェクト(あなたがテスト1と地図のキーで見つかったもの)(null以外のオブジェクトのために)同じhashCode()を持っており、equals() MUSTしなければならない[対称]彼らのために成功します。 (時がある場合もあります。

containsKey()は「場合はtrueを返し、このマップは、そのキーkのマッピングが含まれている場合にのみ(key.equals(k)は、キー==ヌルをK == nullの?)。そのようなマッピングのうちの1つ)。reference)。

+0

はい私はjavadocsを見てきましたが、その後MatrixIndexクラスでequalsメソッドを実装しました。 – somnathchakrabarti

関連する問題