Java TreeMap完全マスター:実例で学ぶソート済みマップ
Java TreeMap
JavaのTreeMapクラス - 強力で自然ソートされるマップ実装 - を明確な例、主要操作、高度なナビゲーション技術で探ります。
TreeMapクラスはJavaコレクションフレームワークの一部で、キーの自然順序付けまたはカスタムComparatorに従ってエントリをソートし続ける赤黒木実装を提供します。NavigableMapインターフェースを実装し、マップの走査とクエリに便利なメソッドを追加します。
TreeMapの作成
TreeMapを使用する前に、パッケージをインポートします:
import java.util.TreeMap;
次にインスタンスを作成します:
TreeMap<Key, Value> numbers = new TreeMap<>();
デフォルトではキーは自然昇順でソートされます。カスタム順序が必要な場合は、コンストラクタにComparatorを渡します。
- Key - 各エントリの一意識別子
- Value - キーに関連付けられるデータ
TreeMapメソッドの概要
このクラスは豊富な操作セットを提供します。以下に主要カテゴリとコードスニペットを示します。
要素の挿入
put()- キー/値ペアを追加または置換putAll()- 他のマップをこのマップにマージputIfAbsent()- キーが欠落している場合のみ挿入
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
evenNumbers.putIfAbsent("Six", 6);
System.out.println("偶数のTreeMap: " + evenNumbers);
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.putAll(evenNumbers);
System.out.println("数値のTreeMap: " + numbers);
}
}
出力
偶数のTreeMap: {Four=4, Six=6, Two=2}
数値のTreeMap: {Four=4, One=1, Six=6, Two=2}
要素へのアクセス
コレクションビューの使用
entrySet()- すべてのキー/値ペアを返すkeySet()- すべてのキーを返すvalues()- すべての値を返す
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("TreeMap: " + numbers);
System.out.println("キー/値マッピング: " + numbers.entrySet());
System.out.println("キー: " + numbers.keySet());
System.out.println("値: " + numbers.values());
}
}
出力
TreeMap: {One=1, Three=3, Two=2}
キー/値マッピング: [One=1, Three=3, Two=2]
キー: [One, Three, Two]
値: [1, 3, 2]
値の取得
get()- キーの値を返す。存在しない場合はnullgetOrDefault()- キーが欠落している場合デフォルトを返す
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("TreeMap: " + numbers);
int value1 = numbers.get("Three");
System.out.println("get()使用: " + value1);
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("getOrDefault()使用: " + value2);
}
}
出力
TreeMap: {One=1, Three=3, Two=2}
get()使用: 3
getOrDefault()使用: 5
エントリの削除
remove(key)- エントリを削除して値を返すremove(key, value)- キーが指定値にマッピングされる場合のみ削除
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("TreeMap: " + numbers);
int removed = numbers.remove("Two");
System.out.println("削除された値: " + removed);
boolean removedPair = numbers.remove("Three", 3);
System.out.println("{Three=3}のエントリは削除されたか? " + removedPair);
System.out.println("更新後のTreeMap: " + numbers);
}
}
出力
TreeMap: {One=1, Three=3, Two=2}
削除された値: 2
{Three=3}のエントリは削除されたか? true
更新後のTreeMap: {One=1}
値の置換
replace(key, value)- キーの値を更新replace(key, old, new)- 現在値がoldと一致する場合のみ更新replaceAll(function)- すべてのエントリに関数を適用
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
System.out.println("元のTreeMap: " + numbers);
numbers.replace("Second", 22);
numbers.replace("Third", 3, 33);
System.out.println("replace()後: " + numbers);
numbers.replaceAll((k, v) -> v + 2);
System.out.println("replaceAll()後: " + numbers);
}
}
出力
元のTreeMap: {First=1, Second=2, Third=3}
replace()後: {First=1, Second=22, Third=33}
replaceAll()後: {First=3, Second=24, Third=35}
ナビゲーションメソッド
TreeMapはNavigableMapを実装するため、構造を効率的にクエリするメソッドを提供します。
最初と最後の要素
firstKey()- 順序上の最初のキーfirstEntry()- 最初のキーのエントリlastKey()- 最後のキーlastEntry()- 最後のキーのエントリ
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
System.out.println("TreeMap: " + numbers);
System.out.println("最初のキー: " + numbers.firstKey());
System.out.println("最後のキー: " + numbers.lastKey());
System.out.println("最初のエントリ: " + numbers.firstEntry());
System.out.println("最後のエントリ: " + numbers.lastEntry());
}
}
出力
TreeMap: {First=1, Second=2, Third=3}
最初のキー: First
最後のキー: Third
最初のエントリ: First=1
最後のエントリ: Third=3
Ceiling、Floor、Higher、Lower
これらのメソッドは、与えられたキーに相対的なキーやエントリを返し、範囲クエリを容易にします。
higherKey()、higherEntry()- 次に大きいキー/エントリlowerKey()、lowerEntry()- 前に小さいキー/エントリceilingKey()、ceilingEntry()- 与えられたキー以上の最小キー/エントリfloorKey()、floorEntry()- 与えられたキー以下の最大キー/エントリ
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 5);
numbers.put("Third", 4);
numbers.put("Fourth", 6);
System.out.println("TreeMap: " + numbers);
System.out.println("higherKey('Fourth'): " + numbers.higherKey("Fourth"));
System.out.println("higherEntry('Fourth'): " + numbers.higherEntry("Fourth"));
System.out.println("lowerKey('Fourth'): " + numbers.lowerKey("Fourth"));
System.out.println("lowerEntry('Fourth'): " + numbers.lowerEntry("Fourth"));
System.out.println("ceilingKey('Fourth'): " + numbers.ceilingKey("Fourth"));
System.out.println("ceilingEntry('Fourth'): " + numbers.ceilingEntry("Fourth"));
System.out.println("floorKey('Fourth'): " + numbers.floorKey("Fourth"));
System.out.println("floorEntry('Fourth'): " + numbers.floorEntry("Fourth"));
}
}
出力
TreeMap: {First=1, Fourth=6, Second=5, Third=4}
higherKey('Fourth'): Second
higherEntry('Fourth'): Second=5
lowerKey('Fourth'): First
lowerEntry('Fourth'): First=1
ceilingKey('Fourth'): Fourth
ceilingEntry('Fourth'): Fourth=6
floorKey('Fourth'): Fourth
floorEntry('Fourth'): Fourth=6
ポーリングと範囲
pollFirstEntry()とpollLastEntry()はそれぞれ最初/最後のエントリを削除して返します。
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
System.out.println("TreeMap: " + numbers);
System.out.println("pollFirstEntry(): " + numbers.pollFirstEntry());
System.out.println("pollLastEntry(): " + numbers.pollLastEntry());
System.out.println("更新後のTreeMap: " + numbers);
}
}
出力
TreeMap: {First=1, Second=2, Third=3}
pollFirstEntry(): First=1
pollLastEntry(): Third=3
更新後のTreeMap: {Second=2}
headMap、tailMap、subMap
これらのメソッドは特定キー範囲のビューを提供します。
headMap(toKey, inclusive)- キー < toKey(inclusiveなら ≤)tailMap(fromKey, inclusive)- キー ≥ fromKey(exclusiveなら >)subMap(fromKey, fromInclusive, toKey, toInclusive)- 2つの境界間のキー
例:
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
numbers.put("Fourth", 4);
System.out.println("TreeMap: " + numbers);
System.out.println("headMap('Fourth'): " + numbers.headMap("Fourth"));
System.out.println("headMap('Fourth', true): " + numbers.headMap("Fourth", true));
System.out.println("tailMap('Second'): " + numbers.tailMap("Second"));
System.out.println("tailMap('Second', false): " + numbers.tailMap("Second", false));
System.out.println("subMap('Fourth', true, 'Third', false): " + numbers.subMap("Fourth", true, "Third", false));
}
}
出力
TreeMap: {First=1, Fourth=4, Second=2, Third=3}
headMap('Fourth'): {First=1}
headMap('Fourth', true): {First=1, Fourth=4}
tailMap('Second'): {Second=2, Third=3, Fourth=4}
tailMap('Second', false): {Third=3, Fourth=4}
subMap('Fourth', true, 'Third', false): {Fourth=4, Second=2}
その他のユーティリティメソッド
| メソッド | 説明 |
|---|---|
clone() | マップのシャローコピーを作成 |
containsKey() | キーの存在確認 |
containsValue() | 特定値の存在確認 |
size() | エントリ数を返す |
clear() | すべてのエントリを削除 |
Comparatorによるカスタムキー順序
キーを異なる順序でソートする場合(逆順、大文字小文字非区別文字列など)、Comparatorを実装し、TreeMapコンストラクタに渡します。
import java.util.TreeMap;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
TreeMap<String, Integer> numbers = new TreeMap<>(new CustomComparator());
numbers.put("First", 1);
numbers.put("Second", 2);
numbers.put("Third", 3);
numbers.put("Fourth", 4);
System.out.println("TreeMap: " + numbers);
}
static class CustomComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
// 自然順序を逆転
return a.compareTo(b) * -1;
}
}
}
出力
TreeMap: {Third=3, Second=2, Fourth=4, First=1}
Comparatorの詳細については公式Javaドキュメントを参照してください。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Javaコレクションアルゴリズム完全ガイド:ソート、シャッフル、検索など
- Java 乱数生成:Random クラスと Math.random 実践ガイド