为双打创建一个HashSet

pet*_*ust 5 java double hashset

我希望使用定义的公差()创建一个HashSet实数(目前为Doubles)epsilon,( 因为使用仅用于精确相等而且是最终类我不能使用它.我最初的想法是扩展(例如,),用方法,并创建一个新的类,其中使用从该值.不过,我想检查是否有现有的解决方案和现有的F/OSS库.Assert.assertEquals(double, double, double)
Double.equals()DoubleHashSetDoubleHashSetsetEpsilon(double)ComparableDoubleequals()DoubleHashSet

(将来我想把它扩展到实数的元组 - 例如矩形和立方体 - 所以一般的方法更可取

注意:@NPE表示这是不可能的.不幸的是我怀疑这是正式的 :-)所以我想知道是否有近似的方法......其他人一定有这个问题并且大致解决了.(我已经经常使用一个工具Real.isEqual(a, b, epsilon),它非常有用.)我准备接受一些不常见的传递性错误.

注意:我将使用TreeSet,因为它解决了"几乎等于()"的问题.稍后我将比较complexNumbers,矩形(以及更复杂的对象),并且能够设置两个相等的限制是非常有用的.复杂数字没有简单的自然排序(也许Cantor方法可行),但我们可以判断它们是否几乎相等.

NPE*_*NPE 5

这种方法存在一些根本性缺陷。

HashSet用于equals()检查两个元素是否相等。合同上equals()有以下要求

它是传递性:对于任何非空的参考值xy以及z,如果x.equals(y)回报率truey.equals(z)回报率true,那么x.equals(z)应该返回true

现在考虑以下示例:

x = 0.0
y = 0.9 * epsilon
z = 1.8 * epsilon
Run Code Online (Sandbox Code Playgroud)

很明显,您提出的比较方案会打破传递性要求(x等于yy等于z,但x不等于z)。在这些情况下,HashSet无法正常工作。

此外,hashCode()由于以下要求,将产生额外的挑战:

如果根据equals(Object)方法两个对象相等,则hashCode对两个对象中的每一个调用该方法必须产生相同的整数结果。

hashCode()可以通过使用 aTreeSet而不是来回避该要求HashSet