Java アドバンス

Java TreeSet

1. Java TreeSet

TreeSetは、重複のないユニークな要素をソートされた順序(整列された状態)で格納するコレクションです。
java.utilパッケージに含まれており、Setインターフェースを実装しています。

       ヒント: 順序を保持しないHashSetとは異なり、TreeSetは要素を追加するたびに自動的にソートを行います。

2. TreeSetの作成

文字列を格納する cars という名前の TreeSet オブジェクトを作成する例を見てみましょう。

import java.util.TreeSet; // TreeSetクラスをインポート

TreeSet<String> cars = new TreeSet<>(); // TreeSetオブジェクトの作成

作成後は、add()contains()remove() などのメソッドを使用して、ソートされた要素の集合を管理できます。

3. 要素の追加

TreeSetに要素を追加するには、add() メソッドを使用します。

3.1 実装コード例

import java.util.TreeSet;

public class Main {
  public static void main(String[] args) {
    TreeSet<String> cars = new TreeSet<>();
    cars.add("Volvo");
    cars.add("BMW");
    cars.add("Ford");
    cars.add("BMW");  // 重複データ
    cars.add("Mazda");

    System.out.println(cars);
  }
}

出力結果:
要素は自動的にソートされます(例: [BMW, Ford, Mazda, Volvo])。

       注意: "BMW" のような重複する値は、セット内に1つしか保持されません。

4. 要素の存在確認

特定の要素が TreeSet 内に存在するかどうかを確認するには、contains() メソッドを使用します。

4.1 実装コード例

cars.contains("Mazda");

5. 要素の削除

特定の要素を削除するには、remove() メソッドを使用します。

5.1 実装コード例

cars.remove("Volvo");

6. すべての要素の削除

セット内のすべての要素を削除するには、clear() メソッドを使用します。

6.1 実装コード例

cars.clear();

7. TreeSetのサイズ

セット内にいくつのユニークな要素があるかを確認するには、size() メソッドを使用します。

7.1 実装コード例

cars.size();

       注意: 重複した値はカウントされず、ユニークな要素の数のみがサイズとして返されます。

8. TreeSetのループ処理

拡張for文(for-each loop) を使用して、TreeSet の要素を反復処理できます。

8.1 実装コード例`

TreeSet<String> cars = new TreeSet<>();
// 要素の追加...

for (String i : cars) {
  System.out.println(i);
}

9. 数値でのTreeSetの使用

TreeSet は数値(Integerなど)に対しても機能し、それらを小さい順から大きい順(昇順)に自動的にソートします。

9.1 実装コード例

import java.util.TreeSet;

public class Main {
  public static void main(String[] args) {
    TreeSet<Integer> numbers = new TreeSet<>();
    numbers.add(40);
    numbers.add(10);
    numbers.add(30);
    numbers.add(20);

    for (int n : numbers) {
      System.out.println(n);
    }
  }
}

出力結果:
数値がソートされた順序(10, 20, 30, 40)で出力されます。

10. HashSet vs TreeSet

要件に応じて適切なセットを選択するための比較表です。

特性HashSetTreeSet
順序順序を保証しないソートされる(自然順序)
重複許可しない許可しない
パフォーマンス高速(ソート処理がないため)比較的低速(ソートが必要なため)

       ヒント: 実行速度を重視する場合は HashSet を、要素を常にソートされた状態で保持したい場合は TreeSet を選択してください。

11. varキーワード

Java 10以降、型名を2回記述せずに var キーワードを使用して TreeSet 変数を宣言できます。コンパイラが代入された値から型を推論します。

11.1 実装比較

// varを使わない場合
TreeSet<String> cars = new TreeSet<String>();

// varを使う場合
var cars = new TreeSet<String>();

12. Setインターフェース

Javaの設計において、以下のようにインターフェース型で変数を宣言することが推奨される場合があります。

import java.util.Set;
import java.util.TreeSet;

Set<String> cars = new TreeSet<>();

これは、変数(cars)を Set インターフェースとして宣言し、実体として TreeSet オブジェクトを格納することを意味します。TreeSetSet を実装しているため、このようなポリモーフィズムを活用した柔軟なコーディングが可能です。