Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为同一对象定义多个哈希函数_Java_Hash - Fatal编程技术网

Java 为同一对象定义多个哈希函数

Java 为同一对象定义多个哈希函数,java,hash,Java,Hash,我有几个集合存储同一类的对象,但我想为每个集合指定不同的标识函数(例如,在一个集合中,如果a.x==B.x,则a==B,而在另一个集合中,如果a.y==B.y,则a==B) 目前我使用树集,每个树集定义了不同的比较器。如果我想切换到hashset,我想知道如何做同样的事情。Java不允许以允许排序/基于树的集合使用比较器的方式传递单独的哈希函数。我能想到的唯一方法是创建一个不同的包装器类,并在每个包装器类中为每个HashSet的元素实现hashCode()方法。有更好的方法吗?为每个集合创建单独

我有几个集合存储同一类的对象,但我想为每个集合指定不同的标识函数(例如,在一个集合中,如果a.x==B.x,则a==B,而在另一个集合中,如果a.y==B.y,则a==B)


目前我使用树集,每个树集定义了不同的比较器。如果我想切换到hashset,我想知道如何做同样的事情。Java不允许以允许排序/基于树的集合使用比较器的方式传递单独的哈希函数。我能想到的唯一方法是创建一个不同的包装器类,并在每个包装器类中为每个HashSet的元素实现hashCode()方法。有更好的方法吗?

为每个集合创建单独的子类怎么样。每个子类的唯一区别是满足您的条件的被重写的哈希函数。

我不知道有更好的方法。您提出的解决方案(具有不同比较逻辑的包装类)听起来非常合理


您提到了实现
hashCode
方法-不要忘记实现
equals

还有另一个选项:您可以复制
HashMap
的源代码,并用其他方法替换方法
hash(对象键)
(例如,调用一个类似于
树映射
比较器
哈希器
).

您可以尝试在中使用THashSet,这支持多种哈希策略。

您可以将子类实现为私有内部类,并提供一个工厂方法来获得所需的相等语义。这将完全封装选择。我想这是最好的做法。我接受Peter Lawry的答案,因为他建议使用现成的实现,而不是自己编写代码。