树集子集

时间:2012-10-11 00:06:53

标签: scjp treeset ocpjp

您好我无法理解为什么输出是'ex [6,7,b,d] [6,7,b]'      这段代码。请有人可以告知子集如何使用      数字和字母?感谢

import java.util.*;
public class Corner {
  public static void main(String[] args) {
    TreeSet<String> t1 = new TreeSet<String>();
    TreeSet<String> t2 = new TreeSet<String>();
    t1.add("b"); t1.add("7");
    t2 = (TreeSet)t1.subSet("5", "c");

     try {
     t1.add("d");
     t2.add("6");
     t2.add("3");
     }
     catch (Exception e) { System.out.print("ex "); }
     System.out.println(t1 + " " + t2);
     } }

1 个答案:

答案 0 :(得分:3)

我做了一些更改来清理代码(使用原始泛型类型和未经检查的转换)并使日志输出更具洞察力:

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稍后这将很重要。

好的,接下来你将t1中的元素“d”添加到t1,但不是t2,因为“d”超出了t2的“5”到“c”的范围。

现在你将元素“6”添加到t2(它仍由t1支持!)。它在t2的正确范围内,因此成功地添加到两个逻辑集中。

现在你遇到了麻烦,因为你试图将“3”添加到t2,这超出范围“5”到“c”,从而导致IllegalArgumentException可以在日志输出中看到。元素插入到t2中(因此也不会插入到t1中)。因此,它不会显示在日志输出的最后一行。

结论:根据JDK文档,您的程序行为与预期一致。 :-)