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方法可行),但我们可以判断它们是否几乎相等.
这种方法存在一些根本性缺陷。
HashSet用于equals()检查两个元素是否相等。合同上equals()有以下要求:
它是传递性:对于任何非空的参考值
x,y以及z,如果x.equals(y)回报率true和y.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等于y和y等于z,但x不等于z)。在这些情况下,HashSet无法正常工作。
此外,hashCode()由于以下要求,将产生额外的挑战:
如果根据
equals(Object)方法两个对象相等,则hashCode对两个对象中的每一个调用该方法必须产生相同的整数结果。
hashCode()可以通过使用 aTreeSet而不是来回避该要求HashSet。
| 归档时间: |
|
| 查看次数: |
2398 次 |
| 最近记录: |