假设我们有一个 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-eps
到 target+eps
的部分(包括在内,如 true
所示参数)。如果这是非空的,则 target
的 eps
中的集合中有一个值。
这显然是一个独立于标准 Set.contains
的概念,因此它可以执行不共享相同属性的包含检查。
您不能对 HashMap
执行相同的 subSet
技巧,因为它是无序映射 - 没有有效的方法来提取给定范围内的值。您将不得不迭代整个集合,如 Sun's answer , 寻找匹配值。
关于java - 是否可以为 Set<Double>.contains() 设置精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52127592/