我想取一个集合和一个范围的交集,这样我得到一个包含不在该范围内的每个元素的集合.例如,我想办法采取set并range从下面的代码片段:
import com.google.common.collect.*;
TreeSet<Integer> set = Sets.newTreeSet();
Collections.addAll(set, 1,2,3,5,11);
Range<Integer> range = Range.closed(4,10);
Run Code Online (Sandbox Code Playgroud)
并返回一个包含just的新TreeSet 5
Lou*_*man 10
在这个特定的例子中,你最好不要使用Range,而是set.subSet(4, true, 10, true)直接使用,但可能你有一个更复杂的用例,你的代码是一个简化的例子.
除了自己处理所有案例之外别无选择.问题的一部分是a NavigableSet可以使用任意的Comparator,但是Range(故意)只能使用值类型的自然顺序,所以在Guava中提供一个任意Range和a NavigableSet和它们相交的方法有些尴尬.
最通用的解决方案看起来像......
if (range.hasLowerBound()) {
if (range.hasUpperBound()) {
return set.subSet(
range.lowerEndpoint(),
range.lowerBoundType() == BoundType.CLOSED,
range.upperEndpoint(),
range.upperBoundType() == BoundType.CLOSED);
} else {
return set.tailSet(
range.lowerEndpoint(),
range.lowerBoundType() == BoundType.CLOSED);
}
} else {
if (range.hasUpperBound()) {
return set.headSet(
range.upperEndpoint(),
range.upperBoundType() == BoundType.CLOSED);
} else {
return set;
}
}
Run Code Online (Sandbox Code Playgroud)
也就是说,值得一提的是,如果你不关心效率,你可以做Iterables.removeIf(set, Predicates.not(range))或者Sets.filter(set, range).