我进行了一些更改以清理您的代码(使用原始泛型类型和未经检查的转换)并使日志输出更具洞察力:
import java.util.SortedSet;
import java.util.TreeSet;
public class Corner {
public static void main(String[] args) {
SortedSet<String> t1 = new TreeSet<String>();
SortedSet<String> t2 = new TreeSet<String>();
t1.add("b");
t1.add("7");
System.out.println(t1 + " " + t2);
t2 = t1.subSet("5", "c");
System.out.println(t1 + " " + t2);
t1.add("d");
System.out.println(t1 + " " + t2);
t2.add("6");
System.out.println(t1 + " " + t2);
try {
t2.add("3");
} catch (Exception e) {
e.printStackTrace(System.out);
}
System.out.println(t1 + " " + t2);
}
}
输出如下所示:
[7, b] []
[7, b] [7, b]
[7, b, d] [7, b]
[6, 7, b, d] [6, 7, b]
java.lang.IllegalArgumentException: key out of range
at java.util.TreeMap$NavigableSubMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at Corner.main(Corner.java:18)
[6, 7, b, d] [6, 7, b]
好的,在插入“b”和“7”之后,t1 以 ASCII(或 Unicode)排序顺序包含这些元素。t2 为空。这里没有惊喜。
调用后subSet
,两个集合具有相同的内容,因为给定范围“5”到“c”跨越了原始集合的整个当前范围,从“7”到“b”。也不足为奇。
请注意:该子集由API JavaDoc描述的原始集支持。
此外,API 描述说返回的集合将IllegalArgumentException
尝试在其范围之外插入元素。这在以后很重要。
好的,接下来您将元素“d”添加到 t1,它显示在 t1 中,但不在 t2 中,因为“d”超出了 t2 的“5”到“c”范围。
现在您将元素“6”添加到 t2(它仍然由 t1 支持!)。它在 t2 的正确范围内,因此成功添加到两个逻辑集中。
现在您遇到了麻烦,因为您尝试将“3”添加到 t2,这超出了“5”到“c”的范围,从而导致IllegalArgumentException
在日志输出中可以看到。该元素没有插入到 t2 中(因此也没有插入到 t1 中)。因此,它没有显示在日志输出的最后一行。
底线:根据 JDK 文档,您的程序的行为与预期的一样。:-)