我已经好几天了。我们的分配要求我覆盖equals()
,更重要的是,hashCode()
。要比较的对象:
二维int数组。
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将完全相同,因为arr2
是arr1
的反映。
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,只要它们符合某个要求,我该怎么办?
答案 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);
}
这样,无论您的数据的原始方向如何,您仍然会提出相同的最终哈希码。