Java アドバンス

Java TreeMap

1. Java TreeMap

TreeMap は、アイテム(キー・バリュー・ペア)をキーによるソート順で格納するコレクションです。

このクラスは java.util パッケージに含まれており、Map インターフェースを実装しています。

       ヒント: 順序を保持しない HashMap とは異なり、TreeMap は常にキーがソートされた状態を維持します。

2. TreeMap の作成

String 型のキーと String 型の値を格納する TreeMap を作成する例です。

2.1 作成の例

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

TreeMap<String, String> capitalCities = new TreeMap<>();

作成後は、put()get()remove() といったメソッドを使用して、ソートされたキー・バリュー・ペアを管理できます。

3. 要素の追加

キー・バリュー・ペアを追加するには、put() メソッドを使用します。

3.1 追加のコード例

import java.util.TreeMap;

public class Main {
  public static void main(String[] args) {
    TreeMap<String, String> capitalCities = new TreeMap<>();
    capitalCities.put("England", "London");
    capitalCities.put("India", "New Dehli");
    capitalCities.put("Austria", "Wien");
    capitalCities.put("Norway", "Oslo");
    capitalCities.put("Norway", "Oslo"); // 重複
    capitalCities.put("USA", "Washington DC");

    System.out.println(capitalCities);
  }
}

出力結果: キーがアルファベット順にソートされます(例: {Austria=Wien, England=London, India=New Dehli, Norway=Oslo, USA=Washington DC})。
注意: "Norway" のような重複したキーは、一度だけ表示されます(最新の値で上書きされます)。

4. 要素へのアクセス

値にアクセスするには、キーを指定して get() メソッドを使用します。

4.1 アクセスの例

capitalCities.get("England");

5. 要素の削除

キーを指定してキー・バリュー・ペアを削除するには、remove() を使用します。

5.1 削除の例

capitalCities.remove("England");

すべてのアイテムを削除するには、clear() を使用します。

5.2 全削除の例

capitalCities.clear();

6. TreeMap のサイズ

キー・バリュー・ペアの総数を確認するには、size() メソッドを使用します。

6.1 サイズ取得の例

capitalCities.size();

注意: サイズはユニークなキーのみをカウントします。同じキーが複数回追加された場合、最新の値のみが保持されます。

7. TreeMap のループ処理

for-each ループを使用して、TreeMap のアイテムをループ処理できます。

注意: キーだけが必要な場合は keySet() メソッドを、値だけが必要な場合は values() メソッドを使用します。

7.1 キーをプリントする例

// キーを表示
for (String i : capitalCities.keySet()) {
  System.out.println(i);
}

7.2 値をプリントする例

// 値を表示
for (String i : capitalCities.values()) {
  System.out.println(i);
}

7.3 キーと値を両方プリントする例

// キーと値を表示
for (String i : capitalCities.keySet()) {
  System.out.println("key: " + i + " value: " + capitalCities.get(i));
}

8. TreeMap vs HashMap

特徴HashMapTreeMap
順序保証されないキーによってソートされる
Null キー1つの null キーを許可null キーを許可しない
パフォーマンス高速(ソートなし)低速(ソート順を維持するため)

       ヒント: パフォーマンスを優先する場合は HashMap を、キーのソートが必要な場合は TreeMap を選択してください。

9. var キーワード

Java 10 以降では、型を2回書かずに var キーワードを使用して TreeMap 変数を宣言できます。コンパイラは代入された値から型を自動的に推論します。

これによりコードは簡潔になりますが、可読性の観点から依然としてフルタイプを使用する開発者も多いです。他のプロジェクトのコードで見かけることもあるため、覚えておくと良いでしょう。

9.1 var を使用した例

// var を使用しない場合
TreeMap<String, String> capitalCities = new TreeMap<String, String>();

// var を使用する場合
var capitalCities = new TreeMap<String, String>();

10. Map インターフェース

注意: Java のコードでは、次のように MapTreeMap の両方が同時に使われているのをよく目にします。

10.1 インターフェースを用いた宣言例

import java.util.Map;
import java.util.TreeMap;

Map<String, String> capitalCities = new TreeMap<>();

これは、変数(capitalCities)が Map(インターフェース)として宣言され、そこに実体である TreeMap オブジェクトを格納していることを意味します。TreeMapMap インターフェースを実装しているため、このようなポリモーフィズムを利用した記述が可能です。