0

Arrays.deepHashCodeonの動作を理解するのに問題がありますint[][]。プログラムは読みやすいと思います。A と B のハッシュは予想どおり同じです。Dも他とは違います。しかし、何らかの理由で、C は A および B と同じです。C は実際には arrayA (および arrayB) の転置ですが、これは偶然の一致であり、同じハッシュ コードが返される理由ではない可能性があります。

でこのメソッドを使用することは想定されていませんint[][]か? int[][]各サブ配列の各要素が互いに等しい場合にのみ、等しい整数を返す独自のhashCodeを作成するための良い方法の提案(同じ位置、同じ長さ...ディープクローンのように)

import java.util.Arrays;
public class Test{
    public static void main(String[] args){

            int[][] arrayA = new int[][]{
                {1,2,3},
                {4,5,6},
                {7,8,9}
            };

            int[][] arrayB = new int[][]{
                {1,2,3},
                {4,5,6},
                {7,8,9}
            };

            int[][] arrayC = new int[][]{
                {1,4,7},
                {2,5,8},
                {3,6,9}
            };

            int[][] arrayD = new int[][]{
                {1,5,9},
                {2,3,7},
                {4,6,8}
            };

            System.out.println("Deep hash codes:");
            System.out.println("Array A: " + Arrays.deepHashCode(arrayA));
            System.out.println("Array B: " + Arrays.deepHashCode(arrayB));
            System.out.println("Array C: " + Arrays.deepHashCode(arrayC));
            System.out.println("Array D: " + Arrays.deepHashCode(arrayD));
    }
}

出力:

Deep hash codes:

Array A: 30729379

Array B: 30729379

Array C: 30729379

Array D: 30760099
4

1 に答える 1

1

各サブ配列の各要素が互いに等しい場合にのみ等しい整数を返す int[][] の独自の hashCode を作成するための良い方法の提案 (同じ位置、同じ長さ...ディープ クローンのように)

それは不可能です。

非常に多くの異なる整数しかありません。整数の配列には、さらに多くの組み合わせがあります。したがって、衝突が発生します。

hashCode ができることは、その逆を保証することだけです。2 つの配列が異なる hashCode を持つ場合、それらは異なります。

于 2013-10-07T03:21:09.840 に答える