注目記事

【Javaコード入門】コレクションフレームワーク_⑨TreeMap

キーに順序を持ったマップ – TreeMapクラス

TreeMapもまた、HashMap同様、要素をキーと値の組み合わせで管理するデータ構造ですが、キーの持ち方が異なります。HashMapではキーの順番を保証しないのに対して、TreeMapではキーを自動的にソートし、順序を保証します。キーの重複を許さない点は、HashMapと同じですし、利用できるメソッドも共通です。

CollTree.java

  1. package com.example.mynavi.collection;
  2.  
  3. import java.util.Map;
  4. import java.util.TreeMap;
  5.  
  6. public class CollTree {
  7.   public static void main(String args) {
  8.     var map = new TreeMap<String, String>() {
  9.       {
  10.         put("PC", "personal computer");
  11.         put("A/C", "air conditioner");
  12.         put("remote", "remote control");
  13.       }
  14.     };
  15.  
  16.     for (var str : map.keySet()) {
  17.       System.out.println(str + ":" + map.get(str));
  18.     }
  19.     if (!map.isEmpty()) {
  20.       System.out.println("要素数は" + map.size() + "個です。");
  21.     }
  22.   }
  23. }

  1. A/C:air conditioner
  2. PC:personal computer
  3. remote:remote control   → キーについてソート済み
  4. 要素数は3個です。

TreeMapでは、引数にComparatorを渡すことで、ソート規則を変更することもできます。

CollCompara.java

  1. package com.example.mynavi.collection;
  2.  
  3. import java.util.Comparator;
  4. import java.util.Map;
  5. import java.util.TreeMap;
  6.  
  7. public class CollCompara {
  8.   public static void main(String args) {
  9.     var m = new TreeMap<String, String>(new Comparator<String>() {
  10.       @Override
  11.       public int compare(String o1, String o2) {
  12.         return o2.length() - o1.length();
  13.       }
  14.     });
  15.     m.put("PC", "personal computer");
  16.     m.put("A/C", "air conditioner");
  17.     m.put("remote", "remote control");
  18.     System.out.println(m);
  19.     // 結果:{remote=remote control, A/C=air conditioner, PC=personal computer}
  20.   }
  21. }

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万部を超える。