TreeMap
キーに順序を持ったマップ – 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) { Map<String, String> map = new TreeMap<String, String>() { { put("PC", "personal computer"); put("A/C", "air conditioner"); put("remote", "remote control"); } }; for (String 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) { Map<String, String> 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を減算していますので、文字列長によって大小を決める、という意味になります。結果を見ると、確かに文字列長の長いものからキーが並べられていることが確認できます。