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-eps至target+eps(包括,如由所指示的true参数).如果非空,可能是在集合中的一个值eps的target.
这显然是一个与标准不同的概念Set.contains,因此可以进行不包含相同属性的包含检查.
你不能subSet用a 做同样的技巧,HashMap因为它是一个无序的地图 - 没有有效的方法来提取给定范围内的值.你需要迭代整个集合,就像Sun的答案一样,寻找匹配的值.