コードをクリーンアップし (生のジェネリック型の使用と未チェックの変換)、ログ出力をより洞察力のあるものにするために、いくつかの変更を加えました。
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 に追加しますが、「d」は t2 の「5」から「c」までの範囲外にあるため、t2 には追加しません。
次に、要素「6」を t2 に追加します (これはまだ t1 によってサポートされています!)。これは t2 の正しい範囲内にあるため、両方の論理セットに正常に追加されています。
ここで、t2 に "3" を追加しようとすると問題が発生します。これは、"5" から "c" の範囲外でありIllegalArgumentException
、ログ出力に表示される which を引き起こします。要素はt2 に挿入されません (したがって、t1 にも挿入されません)。したがって、ログ出力の最終行には表示されません。
結論: あなたのプログラムは、JDK のドキュメントに従って期待どおりに動作します。:-)