【プログラミングしてみよう72】JavaのTreeMapとTreeSetの使い方

Java

前回はPriorityQueueを学びました。

今回は「TreeMap」と「TreeSet」について解説します。前回学んだ二分探索木をベースにした標準クラスで、データを自動的にソートした状態で管理できます。

TreeMapとTreeSetとは

HashMap  → 順番なし・高速
TreeMap  → キーが自動ソート・やや低速

HashSet  → 順番なし・高速
TreeSet  → 自動ソート・やや低速

「挿入した順番より、常にソートされた状態で扱いたい」場面でTreeMap・TreeSetが活躍します。

サンプルコード

ファイル作成

「Java60」フォルダに TreeMapSetTest.java という名前でファイルを作成します

コード入力

import java.util.TreeMap;
import java.util.TreeSet;

public class TreeMapSetTest {
    public static void main(String[] args) {
        // TreeSet: 自動ソートされるSet
        System.out.println("--- TreeSet ---");
        TreeSet<Integer> treeSet = new TreeSet<>();
        treeSet.add(5);
        treeSet.add(1);
        treeSet.add(3);
        treeSet.add(2);
        treeSet.add(4);

        System.out.println("全要素(自動昇順): " + treeSet);
        System.out.println("最小値: " + treeSet.first());
        System.out.println("最大値: " + treeSet.last());
        System.out.println("3以下の要素: " + treeSet.headSet(4));   // 4未満
        System.out.println("3以上の要素: " + treeSet.tailSet(3));   // 3以上

        // TreeMap: キーが自動ソートされるMap
        System.out.println("\n--- TreeMap ---");
        TreeMap<String, Integer> scores = new TreeMap<>();
        scores.put("ぱんまる", 90);
        scores.put("たろう",   75);
        scores.put("はなこ",   85);
        scores.put("あいこ",   88);

        System.out.println("全件(キー昇順): " + scores);
        System.out.println("最初のキー: " + scores.firstKey());
        System.out.println("最後のキー: " + scores.lastKey());

        // 範囲取得
        System.out.println("「た」〜「は」の範囲: " + scores.subMap("た", "へ"));

        // 逆順
        System.out.println("逆順: " + scores.descendingMap());
    }
}

コンパイル

javac TreeMapSetTest.java

実行

java TreeMapSetTest

実行結果は次のようになります。

--- TreeSet ---
全要素(自動昇順): [1, 2, 3, 4, 5]
最小値: 1
最大値: 5
3以下の要素: [1, 2, 3]
3以上の要素: [3, 4, 5]

--- TreeMap ---
全件(キー昇順): {あいこ=88, たろう=75, はなこ=85, ぱんまる=90}
最初のキー: あいこ
最後のキー: ぱんまる
「た」〜「は」の範囲: {たろう=75}
逆順: {ぱんまる=90, はなこ=85, たろう=75, あいこ=88}

まとめ

TreeMapとTreeSetはデータを常にソートされた状態で管理したいときに使います。first()・last() で最小・最大を取得でき、headSet()・tailSet()・subMap() で範囲を指定した取得もできます。順番を気にしない場合はHashMap・HashSetの方が高速なので、用途に応じて使い分けましょう。

2026/08/20(木) ぱんまる

コメント

タイトルとURLをコピーしました