この特定の例では、まったく使用せずに直接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)
.