JavaのTreeMapクラスの使い方を完全ガイド!初心者でもわかるソート付きマップ
Javaの基礎を体系的に整理しながら学習したい方には、 資格対策としても定評のある定番教材が参考になります。
Javaプログラマ Silver SE 17 教科書をAmazonで見る※ Amazon広告リンク
生徒
「先生、Javaでキーと値を組み合わせてデータを管理するクラスってありますか?」
先生
「JavaにはMapインターフェースを実装したクラスがいくつもあり、その中の一つがTreeMapです。」
生徒
「HashMapとどう違うんですか?」
先生
「TreeMapはキーを自動的に並び替えて保持してくれるのが特徴です。それでは詳しく見ていきましょう。」
1. TreeMapクラスとは?
JavaのTreeMapクラスは、java.utilパッケージに含まれているマップ系コレクションの一つです。HashMapと同じくキーと値のペアを格納しますが、大きな違いはキーが自動的に昇順にソートされて保持される点です。そのため、データを整理して保持したい場合に便利です。
例えば、会員番号や商品コードなど、キーを順番通りに並べて処理したいときに役立ちます。内部的には赤黒木というデータ構造を使って実現されており、検索や挿入も効率的に行うことができます。
2. TreeMapの基本的な使い方
TreeMapを使うには、キーと値の型を指定して宣言します。以下は文字列をキー、整数を値として扱う例です。
import java.util.TreeMap;
public class TreeMapExample {
public static void main(String[] args) {
TreeMap<String, Integer> scores = new TreeMap<>();
scores.put("Tanaka", 80);
scores.put("Suzuki", 90);
scores.put("Yamada", 75);
System.out.println(scores);
}
}
{Suzuki=90, Tanaka=80, Yamada=75}
このように追加した順番に関係なく、キーが昇順に並べ替えられて格納されます。
3. TreeMapとHashMapの違い
初心者が混乱しやすいのが、TreeMapとHashMapの違いです。HashMapはキーの順序を保証しませんが、TreeMapは常にキーを昇順に整列させて保持します。そのため、データを順序付きで扱いたい場合はTreeMapが適しています。
ただし、TreeMapは内部でソート処理を行うため、HashMapに比べて挿入や検索の速度が若干遅くなります。性能を重視するか、順序を重視するかによって使い分けるのがポイントです。
4. よく使うメソッド
TreeMapクラスでよく利用されるメソッドをいくつか紹介します。
put(K key, V value):キーと値を追加するget(Object key):指定したキーの値を取得するremove(Object key):キーに対応する要素を削除するfirstKey():最小のキーを取得するlastKey():最大のキーを取得するcontainsKey(Object key):キーが存在するか確認する
import java.util.TreeMap;
public class TreeMapMethods {
public static void main(String[] args) {
TreeMap<Integer, String> users = new TreeMap<>();
users.put(3, "Taro");
users.put(1, "Hanako");
users.put(2, "Ken");
System.out.println("最小のキー: " + users.firstKey());
System.out.println("最大のキー: " + users.lastKey());
System.out.println("2番のユーザー: " + users.get(2));
users.remove(1);
System.out.println("削除後: " + users);
}
}
最小のキー: 1
最大のキー: 3
2番のユーザー: Ken
削除後: {2=Ken, 3=Taro}
5. Comparatorを使った並び替え
TreeMapではデフォルトでキーが昇順に並びますが、Comparatorを指定することで独自の並び順を定義できます。例えば降順に並べたい場合は以下のように記述します。
import java.util.TreeMap;
import java.util.Comparator;
public class TreeMapCustomSort {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>(Comparator.reverseOrder());
map.put("C", 3);
map.put("A", 1);
map.put("B", 2);
System.out.println(map);
}
}
{C=3, B=2, A=1}
このようにComparatorを使うことで、用途に応じた柔軟な順序管理が可能になります。
6. TreeMapの活用シーン
TreeMapは、データをキーの順序付きで扱いたい場合に特に有効です。例えば、スコアランキングを管理したり、商品をコード順に並べて表示したりする用途に適しています。また、範囲検索を行いたい場合にも便利で、subMapやheadMap、tailMapといったメソッドを利用すると、特定の範囲のデータだけを取り出すことができます。
システム開発では、単にデータを格納するだけでなく、順序や検索の効率を意識した設計が重要です。その意味でもTreeMapは基礎を学ぶのにぴったりのクラスです。
7. HashMapやLinkedHashMapとの比較
Javaのマップ系クラスにはいくつかの選択肢があります。HashMapは高速だが順序を保証しない、LinkedHashMapは挿入順序を保持する、そしてTreeMapはキーの昇順にソートするという違いがあります。初心者のうちは「順序をどう扱いたいか」に注目してクラスを選ぶと理解しやすいです。
特に検索エンジンや業務システムの開発では、データの並び順を考慮する場面が多いため、TreeMapを適切に使いこなせるようになると設計力が向上します。
まとめ
ここまでJavaのTreeMapクラスについて、基本的な使い方から応用的な活用方法、さらにHashMapやLinkedHashMapとの違いまで幅広く学んできました。TreeMapはキーを自動的に昇順で保持するという特徴があり、データを並び替えながら管理したい場合に非常に役立ちます。特に会員番号、商品コード、昇順で扱う辞書データ、日付順の履歴管理など、順序を意識したプログラムを書くときに力を発揮します。
プログラミング初心者は、まず「順序を保つ必要があるデータならTreeMapを使う」という考え方を習得すると、実務でのクラス選定がスムーズになります。また、Comparatorを利用すれば標準の昇順以外にも降順や独自ルールでキーを並び替えることができます。これにより、単なるマップ構造を超えて、柔軟な検索・並び替えロジックを実装できます。
さらに、TreeMapは内部で赤黒木(Red-Black Tree)というデータ構造を使っているため、検索・追加・削除の処理がバランスよく行われます。これはデータ量が増えるアプリケーションや、リアルタイムでデータが更新されるシステムでも安定した性能を発揮する要因です。同時に、HashMapより処理が重い場面もあるため、速度が重要な箇所では使い分けが必要です。
▼ まとめ用サンプルコード:日付順に並べるTreeMap
以下は日付(文字列)をキーとして、イベント名を値に保存し、昇順で管理する例です。日付順に扱えるため、スケジュール管理やタイムライン形式のデータに活用できます。
import java.util.TreeMap;
public class ScheduleExample {
public static void main(String[] args) {
TreeMap<String, String> schedule = new TreeMap<>();
schedule.put("2025-03-01", "新機能リリース");
schedule.put("2025-02-15", "テスト開始");
schedule.put("2025-04-10", "最終レビュー");
System.out.println(schedule);
}
}
出力結果は次のようになり、キーが昇順(古い日付 → 新しい日付)で並び替えられています。
{2025-02-15=テスト開始, 2025-03-01=新機能リリース, 2025-04-10=最終レビュー}
このようにTreeMapは単なるコレクションという枠を超え、データの整理や表示順を制御する上で非常に便利な機能を提供します。Javaの中でも実務で頻繁に使われるため、学習の段階で理解しておくと大きな強みになります。
生徒
「TreeMapって、ただのマップじゃなくて並び替えまで自動でやってくれるんですね!」
先生
「その通りです。順番が必要なデータを扱うときに特に便利ですよ。」
生徒
「HashMapより遅いって言ってましたけど、どう使い分ければいいですか?」
先生
「順序が不要なら高速なHashMap、順序が必要ならTreeMap、挿入順を保ちたいならLinkedHashMapという感じで目的に合わせると良いですよ。」
生徒
「Comparatorを使うと降順や独自ルールでソートできるのも便利ですね!」
先生
「ええ、そこまで使いこなせると実務で活用できるレベルと言えるでしょう。」