java树集抛出illegalArgumentException:键超出范围

java树集抛出illegalArgumentException:键超出范围,java,illegalargumentexception,treeset,Java,Illegalargumentexception,Treeset,我已经精简了代码以重现一个抛出错误的示例: 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<

我已经精简了代码以重现一个抛出错误的示例:

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);
  }
}
公共类测试{
公共静态void main(字符串[]args){
NavigableSet集合=新树集合(
数组。asList(“a”、“b”、“c”、“d”);
NavigableSet set2=新树集();
set2=set.tailSet(“c”,假);
set2.addAll(设置耳机(“b”,正确));
系统输出打印项次(set2);
}
}
代码的目的是在检索集合的子集时实现某种类型的滚动。例如,在上述情况下,我希望所有元素从c[独占]到b[包含]。我注意到,如果我注释掉tailSet()或headeat()行,那么其余的代码工作得很好。然而,当我有两条线时,我得到

java.lang.IllegalArgumentException:键超出范围


试着这样做:

  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);
  }

实际上,您丢失了对新创建的
TreeSet
的引用,并获得了
set.tailSet
返回的
SortedSet

也许你可以迭代并手动执行?+1表示良好+1表示“失去对新树集的引用…获取set.tailSet返回的SortedSet”。不知道我怎么会错过。我做了一些测试来确认错误的产生,因为我试图添加“c”字符串。使用NavigableSet set2=新树集(set.tailSet(“c”,false))保存一行;谢谢
set2 = set.tailSet("c", false);