2012-10-11 12 views
1

嗨我很難理解爲什麼輸出爲'ex [6,7,b,d] [6,7,b]'爲 這段代碼。請有人建議如何使用 數字和字母子集?感謝Treeset子集

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

回答

3

我已經做了一些改動來清理你的代碼(原通用型和unchecked轉換的使用),並作出日誌輸出有些更深入:

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的正確範圍內,因此已成功添加到兩個邏輯集中。

現在您遇到了麻煩,因爲您嘗試向t2添加「3」,超出範圍「5」到「c」,因此導致在日誌輸出中可以看到IllegalArgumentException。元素是而不是插入到t2中(因此也不會插入到t1中)。因此它不會顯示在日誌輸出的最後一行。

底線:根據JDK文檔,您的程序的行爲與預期相同。 :-)

+0

非常感謝您的詳細解答 –