hashCode()根据条件返回特定代码

时间:2014-04-08 02:24:50

标签: java arrays hashcode

我已经好几天了。我们的分配要求我覆盖equals(),更重要的是,hashCode()。要比较的对象: 二维int数组。

hashCode()的标准:

  • 任何与任何旋转变体匹配的双暗阵列布局或旋转变体的反射应具有相同的hashCode

    在视觉上,这意味着如果我有这两个2d数组:

    arr 1               arr2
    
    [0, 0, 1]           [1, 0, 0]
    [1, 0, 0]           [0, 0, 1]
    [0, 0, 1]           [1, 0, 0]
    

    以下两个print-statement将完全相同,因为arr2arr1的反映。

    System.out.println(arr1.hashCode());
    System.out.println(arr2.hashCode());   
    



    现在,我对如何实现这一点感到很无奈。我想我必须做这样的事情(伪):

    int hashCode() {
    
        lastHash = listOfArrays.last().hashCode()
        variants = this.getHashVariants()
    
        foreach (variants as v)
            if (lastHash == v) return v
        return this.SystemGeneratedHash()
    }
    

    这种方法可以而且会出错,但是我很难过,这是我能想到的。使hashCode() - 函数依赖于外部列表的想法也感觉真的很蠢。关于这个主题的讲座很糟糕,搜索引擎还没有对我有利。

    问:如果不相同的对象返回相同的hashCode,只要它们符合某个要求,我该怎么办?

  • 2 个答案:

    答案 0 :(得分:2)

    有几种可能的解决方案。这里有四个,就在我的头顶 -

    • 只需返回一个常数。
    • 在所有单元格中添加数字并返回。
    • 取矩阵行列式的绝对值。
    • 将每个条目乘以从单元格到最近角落的距离,并将它们相加。

    这仅限于你的想象力。

    答案 1 :(得分:1)

    老实说,我只会使用Arrays.hashCode()。对于任何旋转对称数组,您需要哈希码相同,因此我会编写一个将数据旋转90度的方法,以及一个反映数据的方法。那时您的代码就像:

    public int hashCode() {
        int[][] once = rotate(data);
        int[][] twice = rotate(once);
        int[][] thrice = rotate(twice);
        int[][] flippedData = flip(data);
        int[][] flippedOnce = flip(once);
        int[][] flippedTwice = flip(twice);
        int[][] flippedThrice = flip(thrice);
    
        return Arrays.hashCode(data) + Arrays.hashCode(once) +
               Arrays.hashCode(twice) + Arrays.hashCode(thrice) +
               Arrays.hashCode(flippedData) + Arrays.hashCode(flippedOnce) +
               Arrays.hashCode(flippedTwice) + Arrays.hashCode(flippedThrice);
    }
    

    这样,无论您的数据的原始方向如何,您仍然会提出相同的最终哈希码。