
そもそもJavaのMapとは?便利なJavaのMapをマスターしよう!
- SE
- JavaのMapとはどのようなものなのでしょうか。
- PM
- キーとそれに紐づいた値を扱うのに適したインターフェイスです。
目次
JavaのMapとは?
JavaのMapは以下の例のような、キーとそれに紐づいた値を扱うのに適したインターフェイスです。一言で言うと辞書的な機能を持っているということです。Mapのような仕組みを連想配列とも言います。
キー:””Java”” 値:””Oracleが提供するオブジェクト指向言語。””
キー:””C#”” 値:””Microsoftが提供するオブジェクト指向言語。””
この記事ではMapインターフェイスを実装した便利なクラスを紹介するので、是非ご覧ください。
HashMapの宣言
Mapを実装したクラスで多く使われるのはHashMapです。以下のように宣言します。なおMapを利用するにはJavaソースの先頭に「import java.util.*;」を追加してください。
Map<String,String> map = new HashMap<String,String>();
Stringが2つありますが、最初のStringはキーの型で、次のStringは値の型です。なおJava 10から型推論ができるようになったため、右側の型指定は以下のように省略できるようになりました。
Map<String,String> map = new HashMap<>();
HashMapの格納と取得
以下がHashMapのデータの格納と取得の方法です。putでキーと値を格納し、getでキーを指定して取得して、値を表示しています。
Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
map.put(“”C#””, “”Microsoftの言語””);
String value = map.get(“”Java””);
System.out.println(value);
実行結果は以下が表示されます。
Oracleの言語
HashMapの中身を全て取得する
上のJavaサンプルのように1つだけ取得するのではなく、全てのデータを取得するにはどうしたら良いのでしょうか。サンプルに以下を追加しましょう。
for (Map.Entry<String,String> e : map.entrySet()) {
System.out.println(e.getKey() + “” “” + e.getValue());
}
実行すると以下のように表示されます。entrySetメソッドでEntryインターフェイスの型としてペアで取得できるということです。
C# Microsoftの言語
Java Oracleの言語
forEachメソッドとラムダ式
上のJavaサンプルは拡張for文を使ってHashMapの中身を表示しましたが、forEachメソッドとラムダ式を使う方法もあります。上と同じ事を以下でも実現できます。
map.forEach((key, value) -> {
System.out.println(key +”” “” + value);
});
なおキーだけを取得する場合はkeySet、値だけを取得する場合はvaluesで以下のように
します。
for (String key : map.keySet()) {
System.out.println(key);
}
for (String value : map.values()) {
System.out.println(value);
}
HashMapの更新
HashMapは同じキーで値の違うデータをputすると、上書きされます。キーは重複を許容しないということです。値を変えたい場合は再度putすれば良いということですが、変更する意図を明示した方が良いので、以下のJavaサンプルのようにreplaceを使うべきでしょう。
Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
map.replace(“”Java””, “”オブジェクト指向言語””);
System.out.println(map.get(“”Java””));
map.replace(“”Java””, “”オブジェクト指向言語””, “”Oracleのオブジェクト指向言語””);
System.out.println(map.get(“”Java””));
2つ目のreplace(A,B,C)は「キーAの値がBだった場合、Cに変更する」と言う意味です。
実行すると以下が表示されます。
オブジェクト指向言語
Oracleのオブジェクト指向言語
HashMapの削除
HashMapの中身を削除するには以下のようにremoveメソッドを使用します。
Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
map.remove(“”Java””);
System.out.println(map.get(“”Java””));
map.put(“”Java””, “”Oracleの言語””);
map.remove(“”Java””, “”Oracleの言語””);
System.out.println(map.get(“”Java””));
System.out.println(map.size()+”” “”+map.isEmpty());
2つ目のremove(A,B)は「キーAの値がBだった場合、削除する」と言う意味です。最後にHashMapの要素数と、空になっているかどうかを表示しています。実行結果は以下になります。
null
null
0 true
なお以下のようにclearを使うと中身を全て削除できます。
map.clear();
HashMapの値チェック
HashMapの中身に指定したキーや値があるかどうかは以下のようにします。
Map<String,String> map = new HashMap<>();
map.put(“”Java””, “”Oracleの言語””);
if (map.containsKey(“”Java””)) System.out.println(“”キーがあります。””);
if (map.containsValue(“”Oracleの言語””)) System.out.println(“”値があります。””);
キーがあるかどうかはgetしてnullが返るかどうかでチェックすればいいのでは、と思うかもしれませんが、以下のようにkeyが存在しているものの値がnullということもありえます。
map.put(“”Java””, null);
TreeMapはキーを自動的にソートしてくれる
JavaにはHashMapとは別にTreeMapというクラスもあります。使い方はHashMapと同じですが、キーを自動的にソートしてくれるという違いがあります。
TreeMap<Integer,String> map = new TreeMap<>();
map.put(3, “”花子””);
map.put(1, “”太郎””);
map.put(2, “”二郎””);
map.forEach((key, value) -> {
System.out.println(key +”” “” + value);
});
実行すると以下のようにキーが昇順にソートされているのがわかります。
1 太郎
2 二郎
3 花子
ただしHashMapでもソートされている場合もあります。それでもHashMapはソートされることが保証されてはいません。
- SE
- JavaのMapを今まで使用したことがありませんでしたが、これほど便利なインターフェイスだったのですね。
- PM
- Mapはキーと値のペアになっているデータを扱う時には欠かせない機能です。是非マスターしておきましょう。
JavaのMapはとても便利!
JavaのMapについて解説しましたが、ご理解頂けましたでしょうか。キーと値のペアになっているデータを扱う時には欠かせない機能なので、是非マスターしてください。