Java 为同一对象定义多个哈希函数
我有几个集合存储同一类的对象,但我想为每个集合指定不同的标识函数(例如,在一个集合中,如果a.x==B.x,则a==B,而在另一个集合中,如果a.y==B.y,则a==B)Java 为同一对象定义多个哈希函数,java,hash,Java,Hash,我有几个集合存储同一类的对象,但我想为每个集合指定不同的标识函数(例如,在一个集合中,如果a.x==B.x,则a==B,而在另一个集合中,如果a.y==B.y,则a==B) 目前我使用树集,每个树集定义了不同的比较器。如果我想切换到hashset,我想知道如何做同样的事情。Java不允许以允许排序/基于树的集合使用比较器的方式传递单独的哈希函数。我能想到的唯一方法是创建一个不同的包装器类,并在每个包装器类中为每个HashSet的元素实现hashCode()方法。有更好的方法吗?为每个集合创建单独
目前我使用树集,每个树集定义了不同的比较器。如果我想切换到hashset,我想知道如何做同样的事情。Java不允许以允许排序/基于树的集合使用比较器的方式传递单独的哈希函数。我能想到的唯一方法是创建一个不同的包装器类,并在每个包装器类中为每个HashSet的元素实现hashCode()方法。有更好的方法吗?为每个集合创建单独的子类怎么样。每个子类的唯一区别是满足您的条件的被重写的哈希函数。我不知道有更好的方法。您提出的解决方案(具有不同比较逻辑的包装类)听起来非常合理
您提到了实现
hashCode
方法-不要忘记实现equals
。还有另一个选项:您可以复制HashMap
的源代码,并用其他方法替换方法hash(对象键)
(例如,调用一个类似于树映射
的比较器
的哈希器
).您可以尝试在中使用THashSet,这支持多种哈希策略。您可以将子类实现为私有内部类,并提供一个工厂方法来获得所需的相等语义。这将完全封装选择。我想这是最好的做法。我接受Peter Lawry的答案,因为他建议使用现成的实现,而不是自己编写代码。