6

エラーをスローする例を再現するために、コードを削除しました。

public class Test {
  public static void main(String[] args) {
    NavigableSet<String> set = new TreeSet<String>(
            Arrays.asList("a", "b", "c", "d"));
    NavigableSet<String> set2 = new TreeSet<String>();
    set2 = set.tailSet("c", false);
    set2.addAll(set.headSet("b", true));
    System.out.println(set2);
  }
}

コードの目的は、セットのサブセットを取得するときに、ある種のロールオーバーを実装することです。たとえば、上記の場合、c [排他的] から b [包括的] までのすべての要素が必要です。tailSet() または headSet() 行をコメントアウトすると、残りのコードがうまく機能することに気付きました。ただし、両方の行がある場合は、

java.lang.IllegalArgumentException: キーが範囲外です

4

1 に答える 1

7

次のようなことを試してください:

  public static void main(String[] args) {
        NavigableSet<String> set = new TreeSet<String>(
                Arrays.asList("a", "b", "c", "d"));
        NavigableSet<String> set2 = new TreeSet<String>();
        set2.addAll(set.tailSet("c", false));
        set2.addAll(set.headSet("b", true));
        System.out.println(set2);
  }

あなたがするとき

set2 = set.tailSet("c", false);

実際には、作成した new への参照を失い、それが返すTreeSetを取得SortedSetset.tailSetます。

于 2012-06-13T09:32:32.297 に答える