マップ.keySet() / values() / entrySet()
| 対応: | Java 1.2(1998) |
|---|
マップのすべてのキー・値・エントリを取得してイテレーション(繰り返し処理)するためのメソッドです。マップの全データを走査する場合や、ストリーム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 以降で使用できます。 |
サンプルコード
sample_HashmapKeysetEntryset.java
import java.util.HashMap;
import java.util.Map;
class HashmapKeysetEntryset {
public static void main(String[] args) {
HashMap<String, Integer> scores = new HashMap<>();
scores.put("五条悟", 85);
scores.put("両面宿儺", 92);
scores.put("虎杖悠仁", 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() + " は上位です。"));
}
}
HashmapKeysetEntryset.java
javac HashmapKeysetEntryset.java java HashmapKeysetEntryset [両面宿儺, 五条悟, 虎杖悠仁] 両面宿儺: 92 五条悟: 85 虎杖悠仁: 78 [92, 85, 78] 合計: 255 両面宿儺 → 92点 五条悟 → 85点 虎杖悠仁 → 78点 両面宿儺: 優秀 五条悟: 合格 虎杖悠仁: 合格 両面宿儺 は上位です。 五条悟 は上位です。
概要
マップを走査する方法はいくつかありますが、最も推奨されるのは『entrySet()』を使ったイテレーションです。『keySet()』で繰り返しながら『get()』を呼び出す方法より、エントリを直接参照する方が内部処理が少なくなります。
Java 8以降は『forEach()』でよりシンプルに書けます。『keySet()』や『entrySet()』が返すビューは元のマップと連動しているため、イテレーション中にマップの要素を追加・削除すると ConcurrentModificationException がスローされます。走査中に削除するには Iterator の remove() を使ってください。
マップの作成・追加・取得には『put() / get()』、マップの削除・確認には『remove() / containsKey()』を使用してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。