Java TreeMapの使い方のサンプル

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

目次

TreeMapクラス

  • 一意の「キー」と「値」の組み合わせを要素として持ちます。
  • キーは任意の文字列を使うことができます。連想配列といえます。
    →連想配列とは添字(キー)に文字列を使用できる配列です。
  • キーの重複は許されません。
  • デフォルトは、キーを自然順序で保持します。Comparatorインターフェースを使って順序のルールを変更することができます。(←HashMap、LinkedHashMapと違う点)
  • スレッドセーフではありません。
  • 以下はJava8 API仕様のTreeMapクラスのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/util/TreeMap.html

Mapインターフェース

  • TreeMapクラスはMapインターフェースを実装しています。
  • TreeMapクラスをインスタンス化する時、TreeMapクラス独自のメソッドを使用しない限り、通常Mapインターフェイス型の変数に代入します。
  • TreeMapクラスは、Mapインターフェースを実装しているので、Mapインターフェイスにあるメソッドを使用できます。
  • 以下はJava8 API仕様のMapインターフェースのリンクです。
    https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html

 キーと値を追加する(putメソッド)

8行目は、TreeMapクラスをインスタンス化してMapインターフェイス型の変数に代入しています。
→ジェネリクス<>でオブジェクトの中身はString,Stringであると宣言しています。
10-12行目は、putメソッドで要素を追加しています。
18行目は、既にあるキーを指定しています。上書きされます。

package test1;
import java.util.TreeMap;
import java.util.Map;

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

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

        colors.put("a", "赤");
        colors.put("b", "黄");
        colors.put("c", "青");
        
        for (Map.Entry<String, String> a : colors.entrySet()) {
            System.out.println(a);//a=赤 b=黄 c=青
        }
        
        colors.put("b", "オレンジ");
        
        for (Map.Entry<String, String> a : colors.entrySet()) {
            System.out.println(a);//a=赤 b=オレンジ c=青
        }
    }
 }

キーを指定して値を取得する(getメソッド)

12行目は、getメソッドで要素の値を取得しています。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");

		System.out.println(colors.get("a")); //赤
	}
 }

キーと値の集合を取得する(entrySetメソッド)

12行目は、entrySetメソッドでキーと値の集合を取得しています。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");
		
		System.out.println(colors.entrySet());//[a=赤, b=黄, c=青]
	}
 }

キーの集合を取得する(keySetメソッド)

12行目は、keySetメソッドでキーの集合を取得しています。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");
		
		System.out.println(colors.keySet());//[a, b, c]
	}
 }

値の集合を取得する(valuesメソッド)

12行目は、valuesメソッドで値の集合を取得しています。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");
		
		System.out.println(colors.values());//[赤, 黄, 青]
	}
 }

要素数を取得する(sizeメソッド)

12行目は、sizeメソッドで要素数を取得しています。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");

		System.out.println(colors.size());//3
	}
 }

指定のキーがあるかを返す(containsKeyメソッド)

12行目は、containsKeyメソッドで指定のキーがあるかを取得しています。
ある場合trueです。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");
		
		System.out.println(colors.containsKey("b"));//true
	}
 }

指定の値があるかを返す(containsValueメソッド)

12行目は、containsValueメソッドで指定の値があるかを取得しています。
ある場合trueです。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");
		
		System.out.println(colors.containsValue("黄"));//true
	}
 }

中身が空かを返す(isEmptyメソッド)

12行目は、isEmptyメソッドで中身が空か取得しています。
空の場合trueです。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");

		System.out.println(colors.isEmpty());//false
	}
 }

キーを指定して削除する(removeメソッド)

12行目は、removeメソッドで指定の要素を削除しています。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");

		colors.remove("a");
		System.out.println(colors);//{b=黄, c=青}
	}
 }

すべての要素を削除する(clearメソッド)

12行目は、clearメソッドですべての要素を削除しています。

package test1;
import java.util.TreeMap;
import java.util.Map;

public class Test1 {
	public static void main(String[] args) {
		Map<String,String> colors = new TreeMap<>();
		colors.put("a", "赤");
		colors.put("b", "黄");
		colors.put("c", "青");

		colors.clear();
		System.out.println(colors);//{}
	}
 }

メソッドの引数がマップのサンプル

メソッドの引数がマップのサンプルです。
12行目は、呼び出し元のメソッドの引数(実引数)にマップを指定しています。
15行目は、定義されたメソッドの引数(仮引数)にマップがあります。
呼び出し元のメソッドの引数の変数名と定義されたメソッドの引数の変数名は異なっていても使用できます。
17行目は、拡張for文です。

package test1;

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

public class Test1 {
    public static void main(String[] args) {
        
        Map<String, String> colors = new TreeMap<>();
        colors.put("a", "赤");
        colors.put("b", "黄");
        showResult(colors);
    }
    
    private static void showResult(Map<String, String> c1) {
        
        for (Map.Entry<String, String> a : c1.entrySet()) {
            System.out.println(a.getKey() + " : " + a.getValue());
        }
        // a : 赤    b : 黄
    }
}

メソッドの戻り値がマップのサンプル

メソッドの戻り値がマップのサンプルです。
9行目は、呼び出し元のメソッドです。戻り値の変数の型がマップになっています。
16行目は、定義されたメソッドです。戻り値の変数の型がマップになっています。

package test1;

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

public class Test1 {
    public static void main(String[] args) {
        
        Map<String, String> c1 = showResult();
        for (Map.Entry<String, String> a : c1.entrySet()) {
            System.out.println(a.getKey() + " : " + a.getValue());
        }
        // a : 赤    b : 黄
    }
    
    private static Map<String, String> showResult() {
        
        Map<String, String> colors = new TreeMap<>();
        colors.put("a", "赤");
        colors.put("b", "黄");
        return colors;
    }
}

並び順を制御するサンプル

TreeMapクラスで値をセットしたときの並び順を制御するサンプルです。

自然順序

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

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}
    }
}

順序のルールを変更する

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

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}
	}
}

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

要素を順番に処理する(forEachメソッド)

forEachメソッドは、要素を順番に処理します。Java8で導入されました。

13-15行目は、for文で要素の値を順番に表示しています。
17行目は、forEachメソッドとラムダ式です。要素の値を順番に表示します。
Java ラムダ式のサンプル

package test1;
import java.util.TreeMap;
import java.util.Map;

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

        Map<String,String> colors = new TreeMap<>();
        colors.put("a", "赤");
        colors.put("b", "黄");
        colors.put("c", "青");
        
        for (Map.Entry<String, String> a : colors.entrySet()) {
            System.out.println(a);//a=赤 b=黄 c=青
        }
        
        colors.forEach((a,b) -> System.out.println(a+b));//a赤 b黄 c青

    }
 }

関連の記事

Java ArrayListの使い方のサンプル
Java LinkedListの使い方のサンプル
Java HashMapの使い方のサンプル
Java LinkedHashMapの使い方のサンプル
Java HashSetの使い方のサンプル
Java 配列/コレクションの値をループで取得するサンプル(拡張for文)
Java リストから配列を作成するサンプル(ArrayList)
Java 配列からリストを作成するサンプル(Arraysクラス)
Java 配列からリストを作成するサンプル(Collectionsクラス)

 はまったらエンジニア特化型Q&Aサイト
【teratail(テラテイル)】で質問しましょう!


△上に戻る