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
要件に応じて適切なセットを選択するための比較表です。
| 特性 | HashSet | TreeSet |
|---|---|---|
| 順序 | 順序を保証しない | ソートされる(自然順序) |
| 重複 | 許可しない | 許可しない |
| パフォーマンス | 高速(ソート処理がないため) | 比較的低速(ソートが必要なため) |
ヒント: 実行速度を重視する場合は 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 オブジェクトを格納することを意味します。TreeSet は Set を実装しているため、このようなポリモーフィズムを活用した柔軟なコーディングが可能です。