Java TreeSet抛出IllegalArgumentException异常:键超出范围

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: key out of range的错误。

也许你可以迭代它并手动完成? - sp00m
1
+1 为一个好的 SSCCE - adarshr
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);

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


+1 是为了“失去对新TreeSet的引用...获取set.tailSet返回的SortedSet”。不确定我是怎么错过了这一点。我进行了几次测试以确认错误是因为我正在尝试将<=“b”的字符串添加到一个子集中,该子集应仅包含>“c”的字符串。通过使用NavigableSet<String> set2 = new TreeSet<String>(set.tailSet("c", false)),我节省了一行代码。谢谢! - Kes115

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接