2012-01-09 14 views
0

上記のコードでhashcode関数が正しい方法で使用されているかどうか確認したいと思います。私はmapに{1,2,3}の代わりにいくつかの奇妙なヌルと0の値があることに気づいた。ハッシュコード関数を持つクラス

public class Test { 

public static void main(String[] args) { 
    int[] array = {1,2,3}; 
    Map<Row, Integer> map = map(array); 
} 

static class Row extends Object { 
     private int value; 
     private volatile int hashCode = 0; 

     public Row(int val) { 
      this.value = val; 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if(this == obj) 
       return true; 
      if((obj == null) || (obj.getClass() != this.getClass())) 
       return false; 
      // object must be Row at this point 
      Row row = (Row)obj; 
       return (value == row.value); 
     } 

     @Override 
     public int hashCode() { 
      final int multiplier = 7; 
      if (hashCode == 0) { 
       int code = 31; 
       code = multiplier * code + value; 
       hashCode = code; 
      } 
      return hashCode; 
     } 
    } 

    private static Map<Row, Integer> map(int[] array) { 
      Map<Row, Integer> arrayMap = new HashMap<Row, Integer>(); 
      for (int i=0; i<array.length; i++) 
       arrayMap.put(new Row(array[i]), i); 
      return arrayMap; 
    } 
} 
+0

私は上記のコードには欠陥がありません。 null値とゼロ値を表示するために使用したコードを含めて、そのコードの正確な出力を表示するのはなぜですか?なぜなら、これを[SSCCE](http://sscce.org/)に変えて、私たちができるようにするのはなぜでしょうか?それを自分で試してみませんか? –

答えて

1

あなたのハッシュコードは、値フィールドがクラスを不変にしてスレッドセーフにすることを除いて私に似ていますが、あまりにも複雑です。 はint値の単なるラッパーです。 hashCodeはに減らすことができます。

return this.value; 

それとも、完全にクラスを回避し、あなたのint型の値をラップするためにIntegerを使用することができます。

4

正確にはどのような問題がありますか?

@Override 
public String toString() { 
    return Integer.toString(value); 
} 

をし、その後マップを印刷::私はクラスにtoStringメソッドを追加する場合

public static void main(String[] args) { 
    int[] array = { 1, 2, 3 }; 
    Map<Row, Integer> map = map(array); 
    System.out.println(map); 
} 

それは印刷されます。{3=2, 1=0, 2=1}。それは正しいようです。

+0

私はここに記載されている問題を解決しています:http://stackoverflow.com/questions/8789979/code-for-searching-similarent-in-multiple-two-dimensional-arraysコードが正しく動作しません。私はデバッグを行い、何かがハッシュコード関数に間違っていると結論づけました。 –

関連する問題