HashSet<String[]> boog = new HashSet<String[]>();
boog.add(new String[]{"a", "b", "c"});
boog.add(new String[]{"a", "b", "c"});
boog.add(new String[]{"a", "b", "d"});
导致
[a, b, c]
[a, b, d]
[a, b, c]
其中[a,b,c]
是重复的,所以哈希函数没有像预期的那样工作。我该如何为String数组重写Hash方法?或者,就此而言,一个泛型数组?有没有更好的方法来完成我试图做的事情?
6条答案
按热度按时间zbdgwd5y1#
你不能。数组使用默认的基于身份的Object.hashCode()实现,而且你不能覆盖它。不要将数组用作HashMap / HashSet中的键!
请改用一组列表。
kwvwclae2#
"更好的方法"是使用集合。使用
List
而不是String[]
:编辑
如果你确实需要使用数组作为键,你可以为每个键构建一个透明的 Package 器,并将其放入Map中,有些库可以帮助你做到这一点,例如,下面是你如何使用Trove来实现
Set<String[]>
:b4wnujal3#
数组的
hashCode()
使用默认的实现,它不考虑元素,你不能改变它。您可以使用
List
来代替,其中hashCode()
是基于其元素的散列码来计算的。ArrayList
(与大多数实现一样)使用这样的函数。或者(但不太可取,除非你被迫使用数组),你可以使用一个“特殊的”
HashSet
,其中调用Arrays.hashCode(array)
而不是调用key.hashCode()
。jtoj6r0c4#
实际上,你可以使用
TreeSet
和提供的Comparator
。在你的例子中,它类似于:在引擎盖下,它看起来像按字母排序的树。
8gsdolmq5#
您实际上使用的是默认的
hashCode
方法,它为所有不同的数组返回不同的值!解决此问题的最佳方法是使用
Collection
(如List
或Set
)或定义您自己的 Package 器类,如:这个类实际上使用的
hashCode
方法与List
的方法几乎相同。您现在处理:
nr7wwzry6#
您可以使用
TreeSet
。TreeSet
使用Comparable.compareTo()
或Comparator.compare()
而不是hashCode()
和equals()
来比较元素。它可以在构造函数中指定。输出:
Arrays::compare
是按字典顺序比较数组的Comparator
。