LoginSignup
3
2

More than 3 years have passed since last update.

Java の TreeMap で Map の値をキーの昇順にソートする

Last updated at Posted at 2019-12-01

概要

  • Map インターフェースの実装としてよく使われている HashMap クラスは順序付けを何も保証していない
  • SortedMap インターフェースはキーの順序付けを提供する
  • TreeMap クラスは SortedMap インターフェースを実装しているため、キーによる順序付けが行われる
  • TreeMap クラスを使うとキーの昇順に自動でソートされる

HashMap クラス

HashMap は何もソートしない。

HashMap (Java SE 11 & JDK 11 )

このクラスはマップの順序を保証しません。特に、その順序を常に一定に保つことを保証しません。

SortedMap インターフェース

SortedMap はキーによるソートを実現する。
entrySet、keySet、values メソッドで返されるキーや値は、キーの順序付けに従ってソートされている。

SortedMap (Java SE 11 & JDK 11 )

そのキーに対して全体順序付けを提供するMapです。 マップの順序付けは、キーの自然順序付けに従って行われるか、ソート・マップ構築時に通常提供されるComparatorを使って行われます。 この順序は、ソート・マップのコレクション・ビュー(entrySet、keySet、valuesメソッドによって返される)の反復処理時に反映されます。 その順序付けを利用するために、追加のオペレーションがいくつか提供されています。 (このインタフェースはマップで、SortedSetに類似しています。)

TreeMap クラス

TreeMap は SortedMap インターフェースを実装しているため、キーによるソートが行われる。

TreeMap (Java SE 11 & JDK 11 )

赤 - 黒ツリーに基づくNavigableMap実装です。 マップは、使用するコンストラクタに応じて、そのキーの自然順序付けに従って、またはマップ作成時に提供されるComparatorによってソートされます。

サンプルコード

HashMap と TreeMap の挙動を確認するソースコード。

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Sample {

  public static void main(String[] args) {

    // HashMap を構築
    // 順番は保証されない
    Map<String, String> hashMap = new HashMap<String, String>();
    hashMap.put("0001", "Alice");
    hashMap.put("0002", "Bob");
    hashMap.put("0003", "Carol");
    hashMap.put("0004", "Dave");
    hashMap.put("0005", "Ellen");
    System.out.println("HashMap");
    for (String key : hashMap.keySet()) {
      System.out.println(key + ": " + hashMap.get(key));
    }
    System.out.println();

    // TreeMap を構築
    // キーの昇順に自動でソートしてくれる
    Map<String, String> treeMap = new TreeMap<String, String>(hashMap);
    System.out.println("TreeMap");
    for (String key : treeMap.keySet()) {
      System.out.println(key + ": " + treeMap.get(key));
    }
    System.out.println();

    // TreeMap に値を追加するとキーの昇順に自動でソートしてくれる
    treeMap.put("0000", "XXXXX");
    System.out.println("TreeMap");
    for (String key : treeMap.keySet()) {
      System.out.println(key + ": " + treeMap.get(key));
    }
    System.out.println();
  }
}

実行結果。
HashMap は何もソートされない。
TreeMap はキーの昇順でソートされている。

HashMap
0004: Dave
0005: Ellen
0002: Bob
0003: Carol
0001: Alice

TreeMap
0001: Alice
0002: Bob
0003: Carol
0004: Dave
0005: Ellen

TreeMap
0000: XXXXX
0001: Alice
0002: Bob
0003: Carol
0004: Dave
0005: Ellen

今回の環境

$ java --version
openjdk 11.0.2 2019-01-15
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2