java - 是否可以为 Set<Double>.contains() 设置精度?

标签 java set double precision

假设我们有一个 Set<Double> 的实现.它包含以下值:[2.0, 5.0, 7.0] .

contains(2.0001d)在这种情况下返回 false因为double值通过完全匹配进行比较。

是否可以为 boolean contains(Object o) 设置一些 double ?方法?

如果不可能,除了将值存储在顺序集合中、遍历它并比较每个值之外,您可以建议什么解决方法?

最佳答案

Set.contains 有一个基于相等的精确定义:

 More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

它会违反它使用除平等以外的任何方法的契约(Contract)。平等有一个精确的定义,它说它必须是可传递的(在其他属性中)。使用公差的相等方法不可传递。

因此,Set.contains 无法允许容差。

但是,这并不是说您不应该检查集合是否包含某个值容差范围内的值 - 只是不要试图重载 contains 的概念去做。

例如,您可以有一个方法接受一个NavigableSet(例如一个TreeSet),并使用它的subSet method :

static boolean containsApprox(NavigableSet<Double> set, double target, double eps) {
  return !set.subSet(target - eps, true, target + eps, true).isEmpty();
}

这只是请求集合中从 target-epstarget+eps 的部分(包括在内,如 true 所示参数)。如果这是非空的,则 targeteps 中的集合中有一个值。

这显然是一个独立于标准 Set.contains 的概念,因此它可以执行不共享相同属性的包含检查。

您不能对 HashMap 执行相同的 subSet 技巧,因为它是无序映射 - 没有有效的方法来提取给定范围内的值。您将不得不迭代整个集合,如 Sun's answer , 寻找匹配值。

关于java - 是否可以为 Set<Double>.contains() 设置精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52127592/

相关文章:

java - 在 Java 中合并多个 XML 文件

java - Spring:使用 BadRequest 处理不明确的映射

python - 在 Python 的排列下没有元素相同的集合的笛卡尔积

c++ - 如何查找输入的 double 是否是 0.05 的倍数

c++ - 如何计算 C++ 中 double 变量的小数位数?

java - 找不到字段的 getter

Java Base64 解码结果意外不同

c++ - 如何在 C++ 中实现更好的重新插入到集合中的效率

java - 如何保证 Set.removeAll 对于不同类型集合的行为?

c++ - 将文本文件读入 vector ( double 、 double 、字符串)? C++