2012-10-11 5 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

Я сделал несколько изменений, чтобы очистить свой код (использование сырья общего типа и неконтролируемого преобразования) и сделать вывод журнала несколько более проницательны:

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] 

Хорошо, после вставки "б" и "7", t1 содержит эти элементы в ASCII (или Unicode) порядок сортировки. t2 пуст. Не удивительно.

После вызова subSet оба набора имеют идентичный контент, так как данный диапазон от «5» до «c» охватывает весь текущий диапазон исходного набора от «7» до «b». Не удивительно.

Обращаем ваше внимание: Подмножество подкреплено исходным набором, как описано API JavaDoc.

Кроме того, в описании API указано, что возвращенный набор будет вызывать IllegalArgumentException при попытке вставить элемент за пределы его диапазона. Это будет важно позже.

Итак, добавьте элемент «d» в t1, который показан в t1, но не в t2, потому что «d» находится за пределами диапазона «5» до «c» от t2.

Теперь вы добавляете элемент «6» в t2 (который по-прежнему поддерживается t1!). Он находится в правильном диапазоне t2 и, таким образом, успешно добавлен к обеим логическим наборам.

Теперь у вас возникают проблемы, потому что вы пытаетесь добавить «3» в t2, который находится за пределами диапазона «5» до «c», что вызывает IllegalArgumentException, который можно увидеть в выходном файле журнала. Элемент равен , а не, вставленный в t2 (и, следовательно, не в t1). Следовательно, он не отображается в последней строке выходного лога.

Итог: Ваша программа ведет себя так, как ожидалось, согласно документации JDK. :-)

+0

Спасибо большое за подробный ответ –

 Смежные вопросы

  • Нет связанных вопросов^_^