提问人:MAK 提问时间:12/28/2009 更新时间:12/28/2009 访问量:193
为同一对象定义多个哈希函数
Defining muliple hash functions for the same object
问:
我有几个集合来存储同一类的对象,但我想为每个集合指定一个不同的恒等函数(即,在一个集合中,如果 A.x==B.x,则为 A==B,而在另一个集合中,如果 A.y==B.y)。
目前,我使用的 TreeSet 为每个比较器定义了不同的比较器。我想知道如果我想切换到 HashSets,如何做同样的事情。Java 不允许传递单独的哈希函数,就像它允许对排序/基于树的集合进行比较器一样。我能想到的唯一方法是创建一个不同的包装类,并在每个 HashSet 的元素中实现 hashCode() 方法。有没有更好的方法?
答:
7赞
Poindexter
12/28/2009
#1
如何为每个集合创建单独的子类。每个子类的唯一区别是符合您条件的被覆盖的哈希函数。
评论
3赞
Andrew
12/28/2009
您可以将子类实现为私有内部类,并提供工厂方法来获取所需的相等语义。这完全封装了选择
3赞
Eli Acherkan
12/28/2009
#2
我不知道有更好的方法。您提出的解决方案(具有不同比较逻辑的包装类)听起来非常合理。
你提到了实现该方法 - 不要忘记实现。hashCode
equals
2赞
Aaron Digulla
12/28/2009
#3
还有另一种选择:您可以复制 的源代码并将其替换为其他内容(例如,对 a 的调用,其工作方式类似于 of the )。HashMap
hash(Object key)
Hasher
Comparator
TreeMap
评论
0赞
MAK
12/29/2009
谢谢。我想这是最好的办法。我接受 Peter Lawry 的回答,因为他建议使用现成的实现而不是编写我自己的代码。
2赞
Peter Lawrey
12/28/2009
#4
你可以尝试在 GNU Trove 中使用 THashSet,它支持多种哈希策略。
评论