Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
マップ.keySet() / values() / entrySet()
マップのすべてのキー・値・エントリを取得してイテレーション(繰り返し処理)するためのメソッドです。マップの全データを走査する場合や、ストリームAPIと組み合わせる際に使われます。
構文
// すべてのキーを Set として返します。
マップ.keySet();
// すべての値を Collection として返します。
マップ.values();
// すべてのキーと値のペア(エントリ)を Set として返します。
マップ.entrySet();
// キーと値のペアにアクセスします。
Map.Entry<K, V> entry = ...;
entry.getKey();
entry.getValue();
// すべてのエントリに対して処理を行います(Java 8 以降)。
マップ.forEach((key, value) -> { /* 処理 */ });
メソッド一覧
| メソッド | 概要 |
|---|---|
| keySet() | マップのすべてのキーを格納した Set を返します。マップと連動しているため、Set を変更するとマップにも影響します。 |
| values() | マップのすべての値を格納した Collection を返します。重複した値も含まれます。 |
| entrySet() | マップのすべてのキーと値のペアを Set<Map.Entry<K, V>> として返します。キーと値を同時に扱いたい場合はこちらが効率的です。 |
| Map.Entry.getKey() | エントリのキーを返します。 |
| Map.Entry.getValue() | エントリの値を返します。 |
| forEach(BiConsumer) | すべてのエントリに対してラムダ式で処理を行います。Java 8 以降で使用できます。 |
サンプルコード
import java.util.HashMap;
import java.util.Map;
HashMap<String, Integer> scores = new HashMap<>();
scores.put("Alice", 85);
scores.put("Bob", 92);
scores.put("Carol", 78);
// keySet() でキーを一覧表示します。
System.out.println(scores.keySet()); // キーの Set が出力されます(順序は不定)。
for (String name : scores.keySet()) {
System.out.println(name + ": " + scores.get(name));
}
// values() ですべての値を取得します。
System.out.println(scores.values()); // 値の Collection が出力されます。
// 合計点を計算します。
int total = 0;
for (int s : scores.values()) {
total += s;
}
System.out.println("合計: " + total); // 合計点が出力されます。
// entrySet() でキーと値を同時に処理します(最も効率的)。
for (Map.Entry<String, Integer> entry : scores.entrySet()) {
System.out.println(entry.getKey() + " → " + entry.getValue() + "点");
}
// forEach() でラムダ式を使って簡潔に記述します(Java 8 以降)。
scores.forEach((name, score) -> {
System.out.println(name + ": " + (score >= 90 ? "優秀" : "合格"));
});
// entrySet() をストリームAPIで処理します。
scores.entrySet().stream()
.filter(e -> e.getValue() >= 85)
.forEach(e -> System.out.println(e.getKey() + " は上位です。"));
概要
マップを走査する方法はいくつかありますが、最も推奨されるのは『entrySet()』を使ったイテレーションです。『keySet()』で繰り返しながら『get()』を呼び出す方法より、エントリを直接参照する方が内部処理が少なくなります。
Java 8以降は『forEach()』でよりシンプルに書けます。『keySet()』や『entrySet()』が返すビューは元のマップと連動しているため、イテレーション中にマップの要素を追加・削除すると ConcurrentModificationException がスローされます。走査中に削除するには Iterator の remove() を使ってください。
マップの作成・追加・取得には『put() / get()』、マップの削除・確認には『remove() / containsKey()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。