Javaについても配列操作は比較的初期の段階で学習する項目の一つですが、今回はこの配列操作のうち「HashMapクラスを使って連想配列を操作する」方法について解説していきます。
Mapインターフェース
JavaにはMapというインターフェースが存在します。
このMapインターフェースはキーを値にマッピングするオブジェクトです。Mapには同一のキーを複数登録できません。また各キーは1つの値にしかマッピングできません。
連想配列を扱うためにはこのMapインターフェースを実装しているTreeMapクラスやHashMapクラス、LinkedHashMapクラスを使用します。
クラスの特徴
Mapインターフェースの中にはHashMapクラスの他、TreeMapクラスやLinkedHashMapクラスがあることは先ほどもご説明しましたが、まずはこれらの違いについてまとめておきます。
- HashMapクラスはキーからハッシュ値を算出して管理するため、順序は保証されない
- TreeMapクラスはキーによってソートされるため、順序を保証する
- LinkedHashMapクラスはデフォルトでは挿入された順番を保持するが、コンストラクタの第3引数にtrueを設定するとアクセス順で要素を保持できる
HashMapクラス
宣言方法
まずはHashMapクラスを使用するためにインスタンスを生成する必要が有ります。
HashMapクラスの宣言は以下のように記述します。
Map<キーの型名, 値の型名> オブジェクト名 = new HashMap<>();
型推論により右辺のデータ型は省略出来ますので覚えておいてください。
なお値にはList/Set/Mapを持たせることができ、キーにはクラスを指定することも可能です。
Map<String, List> map = new HashMap<>(); // 値にListを指定 Map<String, Set> map = new HashMap<>(); // 値にSetを指定 Map<String, Map<Integer, Object>> map = new HashMap<>(); // 値にMapを指定 Map<Sample, List> map = new HashMap<>(); // キーにSampleというクラスを指定
メソッド
この項目では主要なメソッドを紹介します。
メソッド | 使い方 |
---|---|
Map.put(key, value) | マップを追加する。 |
Map.get(key) | マップを取得する。 |
Map.remove(key) | マップを削除する。 |
Map.clear() | マップの要素を全て削除する。 |
Map.containsKey(key) | 指定したKeyが存在する場合はTrue、存在しない場合はfalseを返す。 |
Map.size() | マップの長さを取得する。 |
Map.entrySet() | KeyとValueをセットで取得する。 |
Map.keySet() | Keyのみを取得する。 |
Map.values() | Valueのみを取得する。 |
使い方
では実際のコードを見てみましょう。
値を追加する
Mapに値を追加するには、HashMapクラスで用意されているputメソッドを使用します。
putメソッドは第一引数にキーを指定し、第二引数にキーに関連付けられる値を指定します。
Map<String, String> fruit = new HashMap<>(); fruit.put("grape", "ぶどう"); fruit.put("apple", "りんご"); fruit.put("orange", "みかん");
またブロックを使って次のように記述することも出来ますが、この場合にはダイヤモンド演算子が使えず型引数を省略出来ません。
// new HashMap<>()とするとコンパイルエラーになるので注意! Map<String, String> fruit = new HashMap<String, String>() { { put("grape", "ぶどう"); put("apple", "りんご"); put("orange", "みかん"); } };
なお既にキーがマッピングされている場合には上書きされ、マッピングが無い場合には”null”を返します。
Map<String, String> fruit = new HashMap<>(); fruit.put("grape", "ぶどう"); fruit.put("apple", "りんご"); fruit.put("apple", "みかん"); // この場合には"みかん"が出力される System.out.println(fruit.get("apple")); // マッピングの無いキーを参照すると"null"が返される System.out.println(fruit.get("banana"));
値を取得する
Mapの値は、getメソッドを使用してMapのキーを指定することで取得できます。
import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) throws Exception { Map<String, String> fruit = new HashMap<String, String>() { { put("grape", "ぶどう"); put("apple", "りんご"); put("orange", "みかん"); } }; System.out.println(fruit.get("apple")); } }
実行結果
りんご
キーを全て取得する
keySetメソッドを使用すると、Mapのキーを全て取得することが出来ます。
keySetメソッドはMapのキーをSet型で返すので、拡張for文を使って以下のように繰り返すことで全てのキーを取得できます。
import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) throws Exception { Map<String, String> fruit = new HashMap<String, String>() { { put("grape", "ぶどう"); put("apple", "りんご"); put("orange", "みかん"); } }; for (String key : fruit.keySet()) { System.out.println(key); } } }
実行結果
orange apple grape
値を全て取得する
valuesメソッドを使用すると、Mapの値を全て取得することが出来ます。
valuesメソッドもMapのキーをSet型で返すので、拡張for文を使えばkeySetメソッドのように全ての値を取得できます。
import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) throws Exception { Map<String, String> fruit = new HashMap<String, String>() { { put("grape", "ぶどう"); put("apple", "りんご"); put("orange", "みかん"); } }; for (String val : fruit.values()) { System.out.println(val); } } }
実行結果
みかん りんご ぶどう
キーと値をペアで全て取得する
Map.Entryインタフェースに実装されているentrySetメソッドを使用することで、キーと値をペアで取得できます。
Map.EntryはgetKeyメソッドでキーを、getValueメソッドで値を取得することができます。
entrySetメソッドはMap.EntryをSet型で返すので、拡張for文を使って以下のように繰り返すことで取得できます。
import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) throws Exception { Map<String, String> fruit = new HashMap<String, String>() { { put("grape", "ぶどう"); put("apple", "りんご"); put("orange", "みかん"); } }; for (Map.Entry<String, String> ent : fruit.entrySet()) { System.out.println(ent.getKey() + ":" + ent.getValue()); } } }
実行結果
orange:みかん apple:りんご grape:ぶどう
forEachを使った取得
MapインターフェースにはdefaultメソッドとしてforEachメソッドが定義されています。
次のように定義されているため、2つの引数を必要とします。
default void forEach (BiConsumer<? superK ,? super V> action)
forEachメソッドを使ったコードは以下の通りです。
import java.util.Map; import java.util.HashMap; public class Main { public static void main(String[] args) throws Exception { Map<String, String> fruit = new HashMap<String, String>() { { put("grape", "ぶどう"); put("apple", "りんご"); put("orange", "みかん"); } }; fruit.forEach((key, value) -> System.out.println(key + ":" + value)); } }
実行結果
orange:みかん apple:りんご grape:ぶどう
まとめ
今回はHashmapを使った連想配列の操作について解説しました。
連想配列の使用頻度はかなり高いので何度も繰り返し練習し必ずマスターするようにしましょう。