3

範囲内にないすべての要素を含むセットを取得するために、セットと範囲の交差を取得したいと思います。たとえば、次のコード スニペットから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);

だけを含む新しい TreeSet を返します5

4

1 に答える 1

10

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

于 2013-01-28T22:13:47.527 に答える