public Class myClass{
private final int[][] board;
}
我有
LinkedHashMap<Integer,Object> myMap
其中Integer是我使用Arrays.deepHashCode
创建的哈希码public int hashCode() {
int hash = 5;
hash = 89 * hash + Arrays.deepHashCode(this.board);
return hash;
}
public boolean equals(Object anObject) {
if (anObject == null) return false;
if (anObject == this) return true;
if (!(anObject instanceof myClass))return false;
Puzzle anotherClass = (myClass)anObject;
return Arrays.deepEquals(this.board,anotherClass.board);
}
我获得了新对象,只有当它们不存在时我才需要将它们添加到myMap
。
我尝试使用myMap.containsKey(hashcode)
检查哈希码,显然我正在为不同的对象获取重复的哈希码。
当我从myMap.containsKey(hashcode)
获得真实时,我试图检查更多细节但是我无法将它们添加到myMap,因为它们具有相同的键!
是否有针对此问题的解决方法,因为使用ArrayList
并使用contains()
进行检查非常慢且我有大量迭代。
答案 0 :(得分:1)
看起来你在这里缺少一些关键点。
首先,您不需要在您的Map中使用哈希码值作为键。相反,您必须使用实现哈希码的对象。
第二,作为合同的一部分,您必须实现Object类的hashcode()和equals()方法,以确保这些类(如HashMap,HashSet等)。谁依赖这些方法正常工作
第三,您必须对如何编写好的哈希函数进行一些研究,以最大限度地减少两个对象具有相同哈希码值的可能性。 请查看以下主题
答案 1 :(得分:-1)
我暂时将其留给子孙后代,但基本上其他海报是正确的,你应该使用HashSet
。请参阅以下评论,了解如何巧妙地实现您自己的集合类。你有正确的想法,但细节正在绊倒你。
错了,不能工作:
我在这里走出困境,并猜测你没有为你的班级实施equals()
。
如果您实施hashcode()
,您还必须实施equals()
,否则无效。 (或者至少很多事情都不能很好地发挥作用。)