この特定の例では、まったく使用せずに直接Range使用する方が適切ですset.subSet(4, true, 10, true)が、おそらくより複雑なユースケースがあり、コードは単純化された例です。
実際には多くの選択肢はありませんが、すべてのケースを自分で処理する必要があります。問題の一部は、 aNavigableSetが任意の を使用できることです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;
}
}
とはいえ、効率を気にしないのであれば、Iterables.removeIf(set, Predicates.not(range))またはSets.filter(set, range).