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

And*_*sun 8 java precision double set

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

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

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

如果不可能,除了在顺序集合中存储值,迭代它并比较每个值之外,您可以建议哪种解决方法?

And*_*ner 6

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

 更正式地说,true 当且仅当此集合包含元素e时才  返回  (o==null ? e==null : o.equals(e)).

它会违反其使用除平等以外的任何方法的合同.平等有一个精确的定义,表明它必须是可传递的(在其他属性中).使用容差的等式方法不可传递.

因此,没有办法Set.contains允许容忍.

但是,这并不是说你不应该检查一个集合是否包含一个值在一定值的容差范围内 - 只是不要试图超载contains这样做的概念.

例如,您可以使用一个方法NavigableSet(例如a TreeSet),并使用其subSet方法:

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

这只是请求集合的从运行部分target-epstarget+eps(包括,如由所指示的true参数).如果非空,可能是在集合中的一个值epstarget.

这显然是一个与标准不同的概念Set.contains,因此可以进行不包含相同属性的包含检查.

你不能subSet用a 做同样的技巧,HashMap因为它是一个无序的地图 - 没有有效的方法来提取给定范围内的值.你需要迭代整个集合,就像Sun的答案一样,寻找匹配的值.