キーに順序を持ったマップ – TreeMapクラス
TreeMapもまた、HashMap同様、要素をキーと値の組み合わせで管理するデータ構造ですが、キーの持ち方が異なります。HashMapではキーの順番を保証しないのに対して、TreeMapではキーを自動的にソートし、順序を保証します。キーの重複を許さない点は、HashMapと同じですし、利用できるメソッドも共通です。
CollTree.java
- package com.example.mynavi.collection;
- import java.util.Map;
- import java.util.TreeMap;
- public class CollTree {
- public static void main(String args) {
- var map = new TreeMap<String, String>() {
- {
- put("PC", "personal computer");
- put("A/C", "air conditioner");
- put("remote", "remote control");
- }
- };
- for (var str : map.keySet()) {
- System.out.println(str + ":" + map.get(str));
- }
- if (!map.isEmpty()) {
- System.out.println("要素数は" + map.size() + "個です。");
- }
- }
- }
↓
- A/C:air conditioner
- PC:personal computer
- remote:remote control → キーについてソート済み
- 要素数は3個です。
TreeMapでは、引数にComparatorを渡すことで、ソート規則を変更することもできます。
CollCompara.java
- package com.example.mynavi.collection;
- import java.util.Comparator;
- import java.util.Map;
- import java.util.TreeMap;
- public class CollCompara {
- public static void main(String args) {
- var m = new TreeMap<String, String>(new Comparator<String>() {
- @Override
- public int compare(String o1, String o2) {
- return o2.length() - o1.length();
- }
- });
- m.put("PC", "personal computer");
- m.put("A/C", "air conditioner");
- m.put("remote", "remote control");
- System.out.println(m);
- // 結果:{remote=remote control, A/C=air conditioner, PC=personal computer}
- }
- }
Comparatorで実装すべきメソッドは、compareメソッドだけです。compareメソッドでは、引数o1、o2を比較し、以下のようなルールで戻り値を返すようにします。
- 「o1 > o2」の場合は正の整数を返す
- 「o1 < o2」の場合は負の整数を返す
- 「o1 = o2」の場合はゼロを返す
TreeMapであれば、キー値を順にo1、o2に渡すことで、キーの大小を決定します。この例では、o2.lengthからo1.lengthを減算していますので、文字列長によって大小を決める、という意味になります。結果を見ると、確かに文字列長の長いものからキーが並べられていることが確認できます。
- コレクションフレームワーク_目次
- コレクションフレームワーク
- コレクションを初期化する
- synchronizedList/synchronizedMap/synchronizedSetメソッド
- ArrayListクラス
- asListメソッド
- toArrayメソッド
- LinkedList
- HashMap
- TreeMap
- NavigableMap
- HashSet
- ArrayDeque
監修
山田祥寛(有限会社 WINGSプロジェクト)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NEC にてシステム企画業務に携わるが、2003年 4 月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト(https://wings.msn.to/)」の代表でもある。主な著書に『改訂 3 版JavaScript 本格入門』(技術評論社)、「独習シリーズ(C#・Python・PHP・Ruby・JSP&サーブレットなど)」(翔泳社)、「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravel など)」(Amazon Kindle)など。売り上げの累計は100万部を超える。