連想配列は通常の配列と同じように複数のインスタンスをまとめて管理できます。異なるのは通常の配列が順番によって管理しているのに対して連想配列は鍵と値によって管理しています。連想配列は英語でassociative arrayと言われますがhash mapという言葉でも表現されます。鍵と値はそれぞれkeyとvalueです。
連想配列の仕組み
ホテルや大きい駅には荷物の預かり所があります。そこでは荷物を預けるときに引換券を受け取ります。再び荷物を引き出したいときには引換券を渡します。引換券は複数あっても同じものはありません。同じ引換券を二人が持っているとすると荷物はどちらのものかわからなくなってしまうからです。全く同じ荷物があったとしても引換券が違えば荷物の取り違えは起こりえません。
連想配列ではこの引換券が鍵にあたり荷物が値になります。鍵が同じか判定するのために内部でequalsメソッドで使われています。
ではコートとトランクと傘を連想配列に預けることにします。
HashMap<String, String> hashMap = new HashMap<>(); hashMap.put("a", "コート"); hashMap.put("b", "トランク"); hashMap.put("c", "傘");
java.utilパッケージにあるHashMapクラスを使います。<String, String>というのは鍵と値の型をクラスで宣言していることになります。ここでは鍵も値も文字列としています。そのあとの3つの処理は以下のようにputメソッドを使っています。
- 引換券aでコートを預ける
- 引換券bでトランクを預ける
- 引換券cで傘を預ける
引換券を同じものにすると上書きされてしまうので注意してください。さて今これで預かり所には3つの荷物が預けられました。ここで引換券aで預かっている荷物は何だったのかを見るようにします。
String value_a; value_a = hashMap.get("a"); System.out.println(value_a);
実行すると以下のようになりました。
コート
ここで注意するのはgetで取り出したからといってhashMapから取り除かれたわけではありません。あくまでも「見るだけ」です。なので何回実行しても元のhashMapの内容には影響はありません。
value_a = hashMap.get("a"); System.out.println(value_a); value_a = hashMap.get("a"); System.out.println(value_a); value_a = hashMap.get("a"); System.out.println(value_a); value_a = hashMap.get("a"); System.out.println(value_a);
毎回値が返されるのがわかります。
コート コート コート コート
取り除くには以下のようにremoveメソッドを利用します。戻り値として鍵にひもづけられていた値を返しますがここでもう値は削除されてしまいます。荷物預かり所でいうと「荷物を返した」状態になります。
value_a = hashMap.remove("a"); System.out.println(value_a); value_a = hashMap.get("a"); System.out.println(value_a);
試しにその後getメソッドで値があるか見るようにしています。
コート null
getで見てもnullがもどされもう値がないことがわかります。
連想配列の一覧を表示する
なんども出し入れすると何を預かっているのかわからなくなってしまいます。一度預かっているものの一覧を出しましょう。一覧を出すには以下のような手順を踏みます。
- 鍵の一覧を取得する(keySetメソッドを利用)
- 一覧から一つづつ鍵を取り出し値を表示させる(getメソッドを利用し標準出力に出力)
では多少の出し入れのあとでどうなっているか見て見ましょう。
HashMap<String, String> hashMap = new HashMap<>(); hashMap.put("a", "コート"); hashMap.put("b", "トランク"); hashMap.put("c", "傘"); hashMap.remove("a"); hashMap.put("b", "別のトランク"); hashMap.put("d", "犬"); hashMap.put("e", "買い物袋"); hashMap.remove("c"); Set keys = hashMap.keySet(); for(String key:keys){ System.out.println("引換券" + key + "の荷物は" + hashMap.get(key) + "です。"); }
実行すると以下の通りになります
引換券bの荷物は別のトランクです。 引換券dの荷物は犬です。 引換券eの荷物は買い物袋です。