scjp - 树集子集

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

最佳答案

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

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 文档所预期的那样。 :-)

关于scjp - 树集子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830320/

相关文章:

java - 如果我有多个格式不同的字符串,我是否需要一个单独的 DateFormat 实例来解析每个字符串?

java - SCJP 问题 : Method ambiguous

Java 数组 - 为什么输出 '1' ?

java - 为什么 Double.NaN==Double.NaN 返回 false?

javascript - 将 var 从 JS 传递到 PHP

java - 转换后目标对象属于什么类别?

java - 覆盖 hashCode() 和 equals() 以将对象存储在 hashMap 中无法正常工作

java - 为什么TreeSet的add方法在不同的JRE中表现不同?

java - 我收到运行时异常,但不知道是什么原因造成的