【问题标题】:Treeset subsets树集子集
【发布时间】:2012-10-11 00:06:52
【问题描述】:

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

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

【问题讨论】:

    标签: scjp treeset ocpjp


    【解决方案1】:

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

    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 文档,您的程序的行为与预期的一样。 :-)

    【讨论】:

    • 非常感谢您的详细回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2011-09-01
    • 2016-12-09
    相关资源
    最近更新 更多