Java ツリーマップ
Java ツリーマップ
このチュートリアルでは、例を使って Java TreeMap クラスとその操作について学びます。
TreeMap Java コレクション フレームワークのクラスは、ツリー データ構造の実装を提供します。
NavigableMap インターフェースを実装します。

ツリーマップの作成
TreeMap を作成するには 、 java.util.TreeMap をインポートする必要があります 最初にパッケージ。パッケージをインポートしたら、TreeMap を作成する方法を次に示します。
TreeMap<Key, Value> numbers = new TreeMap<>();
上記のコードでは、 TreeMap を作成しました 名前付き 数字 引数なし。この場合、TreeMap の要素 自然にソートされます (昇順)。
ただし、 Comparator を使用して要素の並べ替えをカスタマイズできます インターフェース。これについては、このチュートリアルの後半で学習します。
ここで、
- キー - マップ内の各要素 (値) を関連付けるために使用される一意の識別子
- 値 - マップ内のキーによって関連付けられた要素
TreeMap のメソッド
TreeMap クラスは、マップ上で操作を実行できるようにするさまざまなメソッドを提供します。
要素を TreeMap に挿入
put()- 指定されたキー/値のマッピング (エントリ) をマップに挿入しますputAll()- 指定されたマップのすべてのエントリをこのマップに挿入しますputIfAbsent()- 指定されたキーがマップに存在しない場合、指定されたキー/値のマッピングをマップに挿入します
たとえば、
import java.util.TreeMap;
class Main {
public static void main(String[] args) {
// Creating TreeMap of even numbers
TreeMap<String, Integer> evenNumbers = new TreeMap<>();
// Using put()
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
// Using putIfAbsent()
evenNumbers.putIfAbsent("Six", 6);
System.out.println("TreeMap of even numbers: " + evenNumbers);
//Creating TreeMap of numbers
TreeMap<String, Integer> numbers = new TreeMap<>();
numbers.put("One", 1);
// Using putAll()
numbers.putAll(evenNumbers);
System.out.println("TreeMap of numbers: " + numbers);
}
}
出力
TreeMap of even numbers: {Four=4, Six=6, Two=2}
TreeMap of numbers: {Four=4, One=1, Six=6, Two=2}
TreeMap 要素にアクセス
<強い>1. entrySet()、keySet()、values() の使用
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);
// Using entrySet()
System.out.println("Key/Value mappings: " + numbers.entrySet());
// Using keySet()
System.out.println("Keys: " + numbers.keySet());
// Using values()
System.out.println("Values: " + numbers.values());
}
}
出力
TreeMap: {One=1, Three=3, Two=2}
Key/Value mappings: [One=1, Three=3, Two=2]
Keys: [One, Three, Two]
Values: [1, 3, 2]
<強い>2. get() と getOrDefault() の使用
get()- 指定されたキーに関連付けられた値を返します。キーが見つからない場合は null を返します。getOrDefault()- 指定されたキーに関連付けられた値を返します。キーが見つからない場合、指定されたデフォルト値を返します。
たとえば、
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);
// Using get()
int value1 = numbers.get("Three");
System.out.println("Using get(): " + value1);
// Using getOrDefault()
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("Using getOrDefault(): " + value2);
}
}
出力
TreeMap: {One=1, Three=3, Two=2}
Using get(): 3
Using getOrDefault(): 5
ここでは、getOrDefault() メソッドはキー Five を見つけられません .したがって、指定されたデフォルト値 5 を返します .
TeeMap 要素を削除
remove(key)- TreeMap から指定されたキーに関連付けられたエントリを返し、削除します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);
// remove method with single parameter
int value = numbers.remove("Two");
System.out.println("Removed value: " + value);
// remove method with two parameters
boolean result = numbers.remove("Three", 3);
System.out.println("Is the entry {Three=3} removed? " + result);
System.out.println("Updated TreeMap: " + numbers);
}
}
出力
TreeMap: {One=1, Three=3, Two=2}
Removed value = 2
Is the entry {Three=3} removed? True
Updated TreeMap: {One=1}
TreeMap 要素を置換
replace(key, value)- 指定された key によってマップされた値を置き換えます 新しい値でreplace(key, old, new)- 古い値が指定されたキーにすでに関連付けられている場合にのみ、古い値を新しい値に置き換えます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("Original TreeMap: " + numbers);
// Using replace()
numbers.replace("Second", 22);
numbers.replace("Third", 3, 33);
System.out.println("TreeMap using replace: " + numbers);
// Using replaceAll()
numbers.replaceAll((key, oldValue) -> oldValue + 2);
System.out.println("TreeMap using replaceAll: " + numbers);
}
}
出力
Original TreeMap: {First=1, Second=2, Third=3}
TreeMap using replace(): {First=1, Second=22, Third=33}
TreeMap using replaceAll(): {First=3, Second=24, Third=35}
上記のプログラムのステートメントに注目してください
numbers.replaceAll((key, oldValue) -> oldValue + 2);
ここでは、ラムダ式を引数として渡しています。
replaceAll() メソッドは、マップのすべてのエントリにアクセスします。次に、すべての要素を新しい値 (ラムダ式から返される) に置き換えます。
ナビゲーションの方法
TreeMap 以降 クラスは NavigableMap を実装しています 、ツリーマップの要素をナビゲートするためのさまざまな方法を提供します。
1.最初と最後の方法
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);
// Using the firstKey() method
String firstKey = numbers.firstKey();
System.out.println("First Key: " + firstKey);
// Using the lastKey() method
String lastKey = numbers.lastKey();
System.out.println("Last Key: " + lastKey);
// Using firstEntry() method
System.out.println("First Entry: " + numbers.firstEntry());
// Using the lastEntry() method
System.out.println("Last Entry: " + numbers.lastEntry());
}
}
出力
TreeMap: {First=1, Second=2, Third=3}
First Key: First
Last Key: Third
First Entry: First=1
Last Entry: Third=3
2.天井、床、上下の方法
- higherKey() - 指定されたキーより大きいキーの中で最も低いキーを返します。
- higherEntry() - 指定されたキーより大きいすべてのキーの中で最も低いキーに関連付けられたエントリを返します。
- lowerKey() - 指定されたキーより小さいすべてのキーの中で最大のキーを返します。
- lowerEntry() - 指定されたキーより小さいすべてのキーの中で最大のキーに関連付けられたエントリを返します。
- ceilingKey() - 指定されたキーより大きいキーの中で最も低いキーを返します。引数として渡されたキーがマップに存在する場合、そのキーを返します。
- ceilingEntry() - 指定されたキーより大きいキーの中で最も低いキーに関連付けられたエントリを返します。引数に渡されたキーに関連付けられたエントリがマップに存在する場合、そのキーに関連付けられたエントリを返します。
- フロアキー() - 指定されたキーより小さいキーの中で最大のキーを返します。引数として渡されたキーが存在する場合、そのキーを返します。
- フロアエントリー() - 指定されたキーよりも小さいキーの中で最大のキーに関連付けられたエントリを返します。引数として渡されたキーが存在する場合、そのキーを返します。
たとえば、
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);
// Using higher()
System.out.println("Using higherKey(): " + numbers.higherKey("Fourth"));
System.out.println("Using higherEntry(): " + numbers.higherEntry("Fourth"));
// Using lower()
System.out.println("\nUsing lowerKey(): " + numbers.lowerKey("Fourth"));
System.out.println("Using lowerEntry(): " + numbers.lowerEntry("Fourth"));
// Using ceiling()
System.out.println("\nUsing ceilingKey(): " + numbers.ceilingKey("Fourth"));
System.out.println("Using ceilingEntry(): " + numbers.ceilingEntry("Fourth"));
// Using floor()
System.out.println("\nUsing floorKey(): " + numbers.floorKey("Fourth"));
System.out.println("Using floorEntry(): " + numbers.floorEntry("Fourth"));
}
}
出力
TreeMap: {First=1, Fourth=6, Second=5, Third=4}
Using higherKey(): Second
Using higherEntry(): Second=5
Using lowerKey(): First
Using lowerEntry(): First=1
Using ceilingKey(): Fourth
Using ceilingEntry(): Fourth=6
Using floorkey(): Fourth
Using floorEntry(): Fourth=6
3. pollFirstEntry() および pollLastEntry() メソッド
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);
//Using the pollFirstEntry() method
System.out.println("Using pollFirstEntry(): " + numbers.pollFirstEntry());
// Using the pollLastEntry() method
System.out.println("Using pollLastEntry(): " + numbers.pollLastEntry());
System.out.println("Updated TreeMap: " + numbers);
}
}
出力
TreeMap: {First=1, Second=2, Third=3}
Using pollFirstEntry(): First=1
Using pollLastEntry(): Third=3
Updated TreeMap: {Second=2}
4. headMap()、tailMap()、および subMap() メソッド
headMap(key, booleanValue)
headMap() メソッドは、指定された key より前のツリーマップのすべてのキーと値のペアを返します (これは引数として渡されます)。
booleanValue パラメータはオプションです。デフォルト値は false です .
true の場合 booleanValue として渡されます 、メソッドには key のキーと値のペアも含まれます これは引数として渡されます。
たとえば、
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("\nUsing headMap() Method:");
// Using headMap() with default booleanValue
System.out.println("Without boolean value: " + numbers.headMap("Fourth"));
// Using headMap() with specified booleanValue
System.out.println("With boolean value: " + numbers.headMap("Fourth", true));
}
}
出力
TreeMap: {First=1, Fourth=4, Second=2, Third=3}
Using headMap() Method:
Without boolean value: {First=1}
With boolean value: {First=1, Fourth=4}
tailMap(key, booleanValue)
tailMap() メソッドは、指定された key から始まるツリーマップのすべてのキーと値のペアを返します (これは引数として渡されます)。
booleanValue オプションのパラメータです。デフォルト値は true です .
false の場合 booleanValue として渡されます 、指定された key のキーと値のペアがメソッドに含まれていません .
たとえば、
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("\nUsing tailMap() Method:");
// Using tailMap() with default booleanValue
System.out.println("Without boolean value: " + numbers.tailMap("Second"));
// Using tailMap() with specified booleanValue
System.out.println("With boolean value: " + numbers.tailMap("Second", false));
}
}
出力
TreeMap: {First=1, Fourth=4, Second=2, Third=3}
Using tailMap() Method:
Without boolean value: {Second=2, Third=3}
With boolean value: {Third=3}
subMap(k1, bV1, k2, bV2)
subMap() メソッドは k1 間のキーに関連付けられたすべてのエントリを返します と k2 k1 のエントリを含む .
bV1 と bV2 オプションのブール値パラメーターです。 bV1 のデフォルト値 true です bV2 のデフォルト値 false です .
false の場合 bV1 として渡されます 、メソッドは k1 間のキーに関連付けられたすべてのエントリを返します と k2 k1 のエントリを含めずに .
true の場合 bV2 として渡されます 、メソッドは k1 間のキーに関連付けられたすべてのエントリを返します と k2 k2 のエントリを含む .
たとえば、
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("\nUsing subMap() Method:");
// Using subMap() with default booleanValue
System.out.println("Without boolean value: " + numbers.subMap("Fourth", "Third"));
// Using subMap() with specified booleanValue
System.out.println("With boolean value: " + numbers.subMap("Fourth", false, "Third", true));
}
}
出力
TreeMap: {First=1, Fourth=2, Second=2, Third=3}
Using subMap() Method:
Without boolean value: {Fourth=4, Second=2}
With boolean value: {Second=2, Third=3}
TreeMap のその他の方法
| メソッド | 説明 |
|---|---|
clone() | TreeMap のコピーを作成します |
containsKey() | TreeMap を検索します 指定されたキーに対して、ブール値の結果を返します |
containsValue() | TreeMap を検索します 指定された値に対して、ブール値の結果を返します |
size() | TreeMap のサイズを返します |
clear() | TreeMap からすべてのエントリを削除します |
ツリーマップ コンパレータ
上記のすべての例で、ツリーマップ要素は自然に (昇順で) 並べ替えられます。ただし、キーの順序をカスタマイズすることもできます。
このためには、ツリーマップ内のどのキーがソートされるかに基づいて、独自のコンパレーター クラスを作成する必要があります。たとえば、
import java.util.TreeMap;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
// Creating a treemap with a customized comparator
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);
}
// Creating a comparator class
public static class CustomComparator implements Comparator<String> {
@Override
public int compare(String number1, String number2) {
int value = number1.compareTo(number2);
// elements are sorted in reverse order
if (value > 0) {
return -1;
}
else if (value < 0) {
return 1;
}
else {
return 0;
}
}
}
}
出力
TreeMap: {Third=3, Second=2, Fourth=4, First=1}
上記の例では、CustomComparator を渡すツリーマップを作成しました。 引数としてのクラス。
CustomComparator クラスは Comparator を実装します
次に、compare() をオーバーライドします 要素を逆順に並べ替えるメソッド。
詳細については、Java Comparator (Java の公式ドキュメント) にアクセスしてください。
Java