2

こんにちは、このコードの出力が「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);
     } }
4

1 に答える 1

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]

さて、「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 のドキュメントに従って期待どおりに動作します。:-)

于 2012-10-27T11:28:44.700 に答える