Java TreeMapの使い方のサンプル

JavaのTreeMapクラスの使い方のサンプルです。

目次

仕組み  TreeMapクラスとは / TreeMapの特徴 / TreeMapとMapの関係
並び順 自然順序にする / キーの文字の順にする / 文字列の長さの順にする
取得 要素を取得(get、for文、forEach)
  要素を検索(containsKeyとcontainsValueの違い)
  中身が空か、要素数を取得(isEmpty/size)
更新 要素を追加・更新(put/replace) / 要素を削除(remove/clear)

TreeMapクラスとは

Map<String,String> color = new TreeMap<>();
color.put("a", "赤");
color.put("b", "青");

1つの変数で複数のキーと値を保持できます。

上記はTreeMapクラスをインスタンス化してMapインターフェイス型の変数に代入しています。
この変数colorは複数のキー(aとb)と値(赤と青)を持てるようになります。
また、デフォルトは、キーを自然順序で保持します。
<>はジェネリクスです。変数colorの各値はStringとStringのみセット可能です。

 

TreeMapの特徴

TreeMapの変数のイメージ

 

要素

各項目を要素(element)といいます。
1つの変数で複数の「キー」と「値」を保持します。
キーは、任意の文字列を使用できます。
値は、StringやIntegerなどの参照型です。int等の基本型は使用できません。

 

キーの順序

デフォルトは、キーを自然順序で保持します。文字列は辞書順で数値は昇順です。(←HashMap、LinkedHashMapと違う点)
Comparatorインターフェースを使って順序のルールを変更することができます。(←HashMap、LinkedHashMapと違う点)

 

その他

キーは一意です。重複は許されません。
値の重複は可能です。
スレッドセーフではありません。

 

以下はOracleのJava8 API仕様のTreeMapクラスのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/TreeMap.html

 

TreeMapとMapの関係

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable

TreeMapクラスはMapインターフェースを実装しています。(NavigableMap→SortedMap→Map)

使用例

Map<String,String> a = new TreeMap<>();

TreeMapクラスをインスタンス化する時、TreeMapクラス独自のメソッドを使用しない限り、Mapインターフェイス型の変数に代入することが多いです。
Mapインターフェイスにあるメソッドを使用できます。

以下はOracleのJava8 API仕様のMapインターフェースのリンクです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html

 

自然順序にする

package test1;

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

public class Test1 {
    public static void main(String[] args) {

        Map<String,Integer> m1 = new TreeMap<>();
        m1.put("caa", 1);
        m1.put("aa", 1);
        m1.put("b", 1);

        System.out.println(m1); // {aa=1, b=1, caa=1}
        
        Map<String,Integer> m2 = new TreeMap<>();
        m2.put("う", 1);
        m2.put("あ", 1);
        m2.put("い", 1);
        
        System.out.println(m2); // {あ=1, い=1, う=1}
        
        Map<Integer,String> m3 = new TreeMap<>();
        m3.put(2, "aa");
        m3.put(3, "bb");
        m3.put(1, "cc");
        
        System.out.println(m3); // {1=cc, 2=aa, 3=bb}
    }
}

14行目は、登録した順序ではなくキーの自然順序(アルファベット順)になっています。
21行目は、キーの並び順が「あいう」になっています。
28行目は、キーの並び順が「123」になっています。

キーの文字の順にする

順序のルールを変更して、キーの文字の降順にするサンプルです。

package test1;

import java.util.Comparator;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {

		//順序のルールを変更。キーの文字の降順にする。
		Map<String, Integer> m = new TreeMap<>(new Comparator<String>() {
			public int compare(String k1, String k2) {
				return k2.compareTo(k1) ;
			}
		});
		m.put("caa", 1);
		m.put("aa", 1);
		m.put("b", 1);

		// キーの文字の降順で表示。c,b,aの並び順。
		System.out.println(m); // {caa=1, b=1, aa=1}
	}
}

11-15行目は匿名クラスです。
Java 匿名クラスのサンプル
11行目のComparatorはインターフェースです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html
13行目は、キーの文字の降順にしています。
16-18行目で値を登録しています。
21行目の結果は、登録した順序ではなくキーの降順(アルファベットの降順)になっています。

上記コードの13行目のreturn k2.compareTo(k1) を
return k1.compareTo(k2)にするとキーの文字の昇順になります。{aa=1, b=1, caa=1}

文字列の長さの順にする

順序のルールを変更して、文字列の長さの昇順にするサンプルです。

package test1;

import java.util.Comparator;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {

		//順序のルールを変更。文字列の長さの昇順にする。
		Map<String, Integer> m = new TreeMap<>(new Comparator<String>() {
			public int compare(String k1, String k2) {
				return k1.length() - k2.length() ;
			}
		});
		m.put("caa", 1);
		m.put("aa", 1);
		m.put("b", 1);

		// 文字列の長さの昇順で表示。
		System.out.println(m); // {b=1, aa=1, caa=1}
	}
}

11-15行目は匿名クラスです。
Java 匿名クラスのサンプル
11行目のComparatorはインターフェースです。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html
13行目は、文字列の長さの昇順にしています。
16-18行目で値を登録しています。
21行目の結果は、登録した順序ではなく字列の長さの昇順になっています。

13行目をreturn k2.length() - k1.length()にすると文字列の長さの降順になります。{caa=1, aa=1, b=1}

要素を取得(get、for文、forEach)

getはキーを指定して値を取得します。
for文とforEachはループで要素を順に取得します。

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

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> color = new TreeMap<>();
		color.put("a", "赤");
		color.put("b", "黄");
		color.put("c", "青");
		
		// get (キーを指定して値を取得)
		System.out.println(color.get("a")); //赤
		System.out.println(color.get("b")); //黄
		System.out.println(color.get("c")); //青
		
		// for文とentrySet (キーと値を取得)
		for (Map.Entry<String, String> c1 : color.entrySet()) {
			System.out.println(c1.getKey());// a b c
			System.out.println(c1.getValue());// 赤 黄 青
		}
		
		// for文とkeySet (キーを取得)
		for (String c1 : color.keySet()) {
			System.out.println(c1);// a b c
		}
		
		// for文とvalues (値を取得)
		for (String c1 : color.values()) {
			System.out.println(c1);// 赤 黄 青
		}
		
		// forEach (変数a以降はラムダ式)
		color.forEach((a,b) -> System.out.println(a+b));//a赤 b黄 c青
	}
 }

33行目の変数a以降はラムダ式です。

要素を検索(containsKeyとcontainsValueの違い)

public boolean containsKey(Object key)
public boolean containsValue(Object value)

containsKeyメソッドは、指定のキーが存在する場合はtrueを、存在しない場合はfalseを返します。 containsValueメソッドは、指定の値が存在する場合はtrueを、存在しない場合はfalseを返します。

	Map<String,String> color = new TreeMap<>();
	color.put("a", "赤");
	color.put("b", "黄");
	color.put("c", "青");
		
	// containsKey
	System.out.println(color.containsKey("b")); // true (存在する)
	System.out.println(color.containsKey("z")); // false (存在しない)
		
	// containsValue
	System.out.println(color.containsValue("黄")); // true (存在する)
	System.out.println(color.containsValue("白")); // false (存在しない)

 

中身が空か、要素数を取得(isEmpty/size)

public boolean isEmpty()
public int size()

isEmptyメソッドは、中身が空の場合はtrueを、そうでない場合はfalseを返します。
sizeメソッドは、要素数を返します。

	Map<String,String> color = new TreeMap<>();
	color.put("a", "赤");
	color.put("b", "黄");
	color.put("c", "青");
		
	System.out.println(color.isEmpty());//false (中身あり)
	System.out.println(color.size());//3 (要素数を表示)
	color.clear();// すべての要素を削除
	System.out.println(color.isEmpty());//true (中身なし)
	System.out.println(color.size());//0 (要素数を表示)

 

要素を追加・更新(put/replace)

public V put(K key,V value)
public V replace(K key, V value)

putメソッドはキーが存在しない場合追加します。キーが存在する場合上書きします。
replaceメソッドはキーを指定して値を置き換えます。

    Map<String,String> color = new TreeMap<>();

    // put (キーが存在しないので追加)
    color.put("a", "赤");
    color.put("b", "黄");
    System.out.println(color);//{a=赤, b=黄}
        
    // put (キーが存在するので更新)
    color.put("b", "オレンジ");
    System.out.println(color);//{a=赤, b=オレンジ}
        
    // replace (キーを指定して置き換え)
    color.replace("b", "シルバー");
    System.out.println(color);//{a=赤, b=シルバー}

 

要素を削除(remove/clear)

public V remove(Object key)
public void clear()

removeメソッドは指定の位置の要素を削除します。
clearメソッドはすべての要素を削除します。

	Map<String,String> color = new TreeMap<>();
	color.put("a", "赤");
	color.put("b", "黄");
	color.put("c", "青");

	color.remove("a"); // 指定の要素を削除
	System.out.println(color);//{b=黄, c=青}

	color.clear(); // すべての要素を削除
	System.out.println(color);//{}

関連の記事

Java HashMapとMapの使い方のサンプル
Java LinkedHashMapの使い方のサンプル

△上に戻る