Javaでも実は連想配列を使うことができる。
連想配列とは、要素番号ではなくて、言葉同士で配列を取り出したり操作したりするものだ。詳しくは後でお伝えする。
そのために使うのがHashMapだ。このページでは、JavaのHashMapについてご紹介していく。理解しておくと、必ず役に立つ機会があるはずだ。
目次
HashMapによる連想配列
連想配列とは?
Javaの配列では、値の取得はインデックス番号で行ってきた。要するに、配列名[数字]で取り出す意味だ。
データベースのように名前で検索して、値を格納したり、取り出したりできない。例えば、「orange」というキーワードで「みかん」という値を取り出すなどができない。
このように言葉同士でキーと値が繋がった配列を連想配列という。例えば、次の配列では、"one"と"10"、"two"と"20"などが繋がっている。
配列で、"one"を指定すると"10"が取り出せるようになっているわけだ。
連想配列が使えると、フォームから送られたデータの扱いなど様々な場面で便利に使える。
HashMap
Javaで連想配列を使うときは、「HashMap」を使う。
HashMapを使うとキーに紐付けされて、HashMapに格納された値にアクセスできるようになる。
HashMapに格納する値は、キーが異なれば同じ値であってもかまわない。しかし、キーが同じ場合は、最後に格納された値で前の値が上書きされる。
JavaでのHashMapを使うための書き方の詳細を確認していこう。
HashMapクラスを使うための準備をする
まず、mapにアクセスするために、コンストラクタを使ってその入れ物となるHashMapクラスのオブジェクトを生成しなければならない。
そのコンストラクタの書き方の詳細を見てみよう。サンプルコードも後半に置いてあるので先にそちらを確認したければスクールして下に行ってほしい。
HashMap()
内容 |
容量が16でload factor(0.75)の空のHashMapを生成する。 ※ load factor(0.75)とは、3/4埋まったら容量を2倍にするということ |
HashMap(int initalCapacity)
内容 |
指定された容量でload factor(0.75)の初期値を持った空のHashMapを生成する。 引数:initialCapacity - 初期容量 例外:IllegalArgumentException - もし指定されたinitialCapacity がマイナスであるならば |
値を追加して取得するメソッド
mapにキーと値を追加しなければ、何も始まらない。次に、追加された値を取り出す。これが基本的なメソッドだ。それらのメソッドの詳細を見てみよう。
追加
追加するためのメソッドと置換するメソッドはひとつだ。キーがなければ、追加されるし。そでに存在すれば、前の値が置換される。
put(K key, V value)
戻り値の型 |
public V |
内容 |
指定されたキーと指定された値をmapの中で関連させる、もし、既にmapが指定されたキーのための関連を持っていたならば、古い値は置き換えられる。
引数: key - 指定された値と関連させるべきキー value - キーと関連させるべき値
戻り値:キーと関連ある前の値。または、もしキーと関連がないならば、null。(戻り値nullは、前の関連がキーとnullであったことも示すことができる) |
値の取得
キーを指定して、mapされた値を取得する。もしmapが見つからなければ、戻り値nullで教えてくれる。
get(Object key)
戻り値の型 |
public V |
内容 |
指定されたキーが関連付けられている値を返す。または、もしmapがキーの関連を含んでいないならば、nullを戻す。 形式的に言えば、もしmapがキーkから値vへ(key==null ? k==null : key.equals(k))のような関連を含んでいたら、このメソッドはvを戻す。そうでなければ、nullを戻す。(そのような関係は、ひとつしかありえない) 戻り値nullは、mapがキーの関連を持っていないことを必ずしも示していない。つまり、mapがはっきりとkeyにnullを関連させている可能性がある。
引数:key - 戻すべき値と関連付けられたキー 戻り値:指定されたキーに関連付けられた値。もしこのmapがキー対する関連付けを含んでいないなら、null。 |
サンプルプログラム
それでは実際にサンプルプログラムで確認してみよう。これを見るとわかりやすいはずだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.util.HashMap; public class HashMapAddition { public static void main(String[] args) { HashMap<String, String> hashmap = new HashMap<String, String>();//[1] hashmap.put("apple", "りんご");//[2] hashmap.put("orange", "みかん");//[3] hashmap.put("peach", "もも");//[4] System.out.println("[5] 値[0]:" + hashmap.get("apple")); System.out.println("[6] 値[1]:" + hashmap.get("orange")); System.out.println("[7] 値[2]:" + hashmap.get("peach")); System.out.println("[8] 値[3]:" + hashmap.get("mango")); } } |
実行結果
1 2 3 4 |
[5] 値[0]:りんご [6] 値[1]:みかん [7] 値[2]:もも [8] 値[3]:null |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
このプログラムは、くだものの名前を3組のキー:英文と値:日本文の関連で追加する。次に、値を取得して表示している。このとき、存在しないキーを設定して、nullが表示されるかを確認している。
- [1] HashMapクラスのオブジェクト、mapを生成する。
- [2] mapにキー:「apple」値:「りんご」を追加する。
- [3] mapにキー:「orange」値:「みかん」を追加する。
- [4] mapにキー:「peach」値:「もも」を追加する。
- [5] mapからキー:「apple」で取得した値を表示する。
- [6] mapからキー:「orange」で取得した値を表示する。
- [7] mapからキー:「peach」で取得した値を表示する。
- [8] mapからキー:「mango」で取得した値を表示する。
キーにmapした値を置換削除するメソッド
前のセクションではputメソッドによりキーと値を追加した。そのキーを使って値を変更することも、値を削除することもできる。その詳細を見てみよう。
置換
前のセクションの「追加」で説明したputメソッドを参照。
削除
キーを指定して、値を削除する。戻り値に削除された値が返されるので、確実に期待する値が削除されたかどうかが分かる。
remove(Object key)
戻り値の型 |
public V |
内容 |
もし存在するならば、mapから指定されたキーの関連付けを削除する。
引数:key – mapから削除されるべき関連付けのキー 戻り値:キーに関連付けられた前の値。または、もしキーの関連付けがないならば、null。(戻り値nullは、mapが前にキーとnullを関連付けていたことも意味している) |
値を検索して置換削除するサンプルプログラム
それでは実際にサンプルプログラムで確認してみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.HashMap; public class HashMapChangeAndRemove { public static void main(String[] args) { HashMap<String, String> hashmap = new HashMap<String, String>();//[1] hashmap.put("apple", "りんご");//[2] hashmap.put("orange", "みかん");//[3] hashmap.put("peach", "もも");//[4] System.out.println("[5] [キー:apple]:" + hashmap.get("apple")); System.out.println("[6] [キー:orange]:" + hashmap.get("orange")); System.out.println("[7] [キー:peach]:" + hashmap.get("peach")); String previousValue = hashmap.put("apple", "リンゴ"); //[8] System.out.println("[9] 置換された[キー:apple]:" + previousValue); String removedValue = hashmap.remove("peach"); //[10] System.out.println("[11] 削除された[キー:peach]:" + removedValue); System.out.println("[12] [キー:apple]:" + hashmap.get("apple")); System.out.println("[13] [キー:orange]:" + hashmap.get("orange")); System.out.println("[14] [キー:peach]:" + hashmap.get("peach")); } } |
実行結果
1 2 3 4 5 6 7 8 |
[5] [キー:apple]:りんご [6] [キー:orange]:みかん [7] [キー:peach]:もも [9] 置換された[キー:apple]:りんご [11] 削除された[キー:peach]:もも [12] [キー:apple]:リンゴ [13] [キー:orange]:みかん [14] [キー:peach]:null |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
このプログラムは、くだものの名前を最初に3つ追加した後、追加した値の「りんご」を「リンゴ」に置換する。「もも」を削除する。次に、置換した値を表示して置換を確認している。削除した値は取得して、戻り値がnullであることを確認している。
- [1] HashMapクラスのオブジェクト、mapを生成する。
- [2] mapにキー:「apple」値:「りんご」を追加する。
- [3] mapにキー:「orage」値:「みかん」を追加する。
- [4] mapにキー:「peach」値:「もも」を追加する。
- [5] mapのキー: appleにmapされた値を表示する。
- [6] mapのキー: orangeにmapされた値を表示する。
- [7] mapのキー: peachにmapされた値を表示する。
- [8] mapのキー: appleを文字列:「リンゴ」で置換する。
- [9] 置換前の値を表示する。
- [10] mapのキー: peachを削除する。
- [11] 削除した値を表示する。
- [12] mapのキー: appleにmapされた値を表示する。
- [13] mapのキー: orangeにmapされた値を表示する。
- [14] mapのキー: peachにmapされた値を表示する。
値すべてに対して繰り返し処理(forEach)
値をリストからひとつひとつ取り出して、何かの処理をすることはよくある。その基本からラムダ式まで詳細を見てみよう。
forEach(BiConsumer<? super K,? super V> action)
戻り値の型 |
public void |
内容 |
すべてのentryが処理されるか、actionが例外を発生させるまで、各々のentryのためのactionが実行される。実装されたクラスによって特定されない限り、entry set繰り返しの順序でactionが実行される(繰り返しの並びが特定されるならば)。actionより投げられた例外は、呼び出し元に中継される。
引数:action – 各々の値のために実行されるべきaction。 |
keySet()
戻り値の型 |
public Set<K> |
内容 |
このmapに含まれるキーのSet viewを戻す。それは、mapと連動しているので、mapへの変更はsetへ反映される。逆も同様です。 もしsetの繰り返し処理が進行中にmapが修正されたなら(iterator自身の削除操作は例外)、繰り返し処理の結果は定義されていない。setは要素の削除をサポートしている。それはmapから対応するmappingをIterator.remove,、Collection.remove、 removeAll,、retainAll、 とclear操作を経由で削除する。addやaddAll操作はサポートされていない。
戻り値:このmapに含まれるkeysのviewを返す。 |
values()
戻り値の型 |
public Collection<V> |
内容 |
このmapに含まれる値のCollection viewを戻す。それは、mapと連動しているので、mapへの変更はcollectionへ反映される。逆も同様です。 もしcollectionの繰り返し処理が進行中にmapが修正されたなら(iterator自身の削除操作は例外)、繰り返し処理の結果は定義されていない。collectionは要素の削除をサポートしている。それはmapから対応する関連付けをIterator.remove,、Collection.remove、 removeAll,、retainAll、 とclear操作を経由で削除する。addやaddAll操作はサポートされていません。
戻り値:このmapに含まれるvaluesのviewを返す。 |
entrySet()
戻り値の型 |
public Set<Map.Entry<K,V>> |
内容 |
このmapに含まれる関連付けのSet viewを戻す。それは、mapと連動しているので、mapへの変更はsetへ反映される。逆も同様です。 もしsetの繰り返し処理が進行中にmapが修正されたなら(iterator自身の削除操作、またはiteratorによって戻されたmap entryのsetValue操作は例外)、繰り返し処理の結果は定義されていない。setは要素の削除をサポートしている。それはmapから対応する関連付けをIterator.remove,、Collection.remove、 removeAll,、retainAll、 とclear操作を経由で削除する。addやaddAll操作はサポートされていません。
戻り値:このmapに含まれる関連付けのviewを返す。 |
whileを使ったサンプルプログラム
それでは実際にサンプルプログラムで確認してみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import java.util.*; public class HashMapFor { public static void main(String[] args) { HashMap<String, String> map = new HashMap<String, String>();//[1] map.put("apple", "りんご");//[2] map.put("orange", "みかん");//[3] map.put("peach", "もも");//[4] Set<String> keySet = map.keySet();//[5] Iterator<String> iteratorForKey = keySet.iterator();//[6] while(iteratorForKey.hasNext()) {//[7] String key = iteratorForKey.next();//[8] System.out.println("[9]キー:" + key); } Collection<String> values = map.values();//[10] Iterator<String> iteratorForValues = values.iterator();//[11] while(iteratorForValues.hasNext()) {//[12] String value = iteratorForValues.next();//[13] System.out.println("[14]値:" + value); } Set<Map.Entry<String, String>> entrySet = map.entrySet();//[15] Iterator<Map.Entry<String, String>> iteratorForMap = entrySet.iterator();//[16] while(iteratorForMap.hasNext()) {//[17] Map.Entry<String, String> entry = iteratorForMap.next();//[18] System.out.println("[19]キー:" + entry.getKey() + " 値:" + entry.getValue()); } } } |
実行結果
どのサンプルプログラムも実行結果は同じになる。
1 2 3 4 5 6 7 8 9 |
[8]キー:orange [8]キー:apple [8]キー:peach [12]値:みかん [12]値:りんご [12]値:もも [16]キー:orange 値:みかん [16]キー:apple 値:りんご [16]キー:peach 値:もも |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
このプログラムは、くだものの名前を3つ追加した後、forを使用してmapの値をすべて表示している。
- [1] HashMapクラスのオブジェクト、mapを生成する。
- [2] mapにキー:「apple」値:「りんご」を追加する。
- [3] mapにキー:「orage」値:「みかん」を追加する。
- [4] mapにキー:「peach」値:「もも」を追加する。
- [5] [6] mapのキーのIteratorを取得する。
- [7] [8] Iteratorを使用して、すべてのキーをひとつずつ取得する。
- [9] キーを表示する。
- [10] [11] mapの値のIteratorを取得する。
- [12] [13] Iteratorを使用して、すべての値をひとつずつ取得する。
- [14] 値を表示する。
- [15] [16] mapのキーと値のIteratorを取得する。
- [17] [18] Iteratorを使用して、すべてのキーと値をひとつずつ取得する。
- [19] キーと値を表示する。
拡張forを使ったサンプルプログラム
このプログラムが拡張forを使ったサンプルプログラムだ。値を表示するところだけがforと違う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.HashMap; import java.util.Map; public class HashMapEnhancedFor { public static void main(String[] args) { HashMap<String, String> hashmap = new HashMap<String, String>();//[1] hashmap.put("apple", "りんご");//[2] hashmap.put("orange", "みかん");//[3] hashmap.put("peach", "もも");//[4] for(String key : hashmap.keySet()) {//[5] System.out.println("[6]キー:" + key); } for(String value : hashmap.values()) {//[7] System.out.println("[8]値:" + value); } for(Map.Entry<String, String> entry : hashmap.entrySet()) {//[9] System.out.println("[10]キー:" + entry.getKey() + " 値:" + entry.getValue());//[10] } } } |
実行結果
1 2 3 4 5 6 7 8 9 |
[6]キー:orange [6]キー:apple [6]キー:peach [8]値:みかん [8]値:りんご [8]値:もも [10]キー:orange 値:みかん [10]キー:apple 値:りんご [10]キー:peach 値:ももん |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
このプログラムは、くだものの名前を3つ追加した後、forを使用してmapの値をすべて表示している。
- [1] HashMapクラスのオブジェクト、mapを生成する。
- [2] mapにキー:「apple」値:「りんご」を追加する。
- [3] mapにキー:「orage」値:「みかん」を追加する。
- [4] mapにキー:「peach」値:「もも」を追加する。
- [5][6] 拡張forを使用して、mapのキーをすべて表示する。
- [7][8] 拡張forを使用して、mapの値をすべて表示する。
- [9][10] 拡張forを使用して、mapのキーと値をすべて表示する。
forEachを使ったサンプルプログラム
このプログラムがforEachを使ったサンプルプログラムだ。値を表示するところだけがforと違う。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import java.util.HashMap; public class HashMapForEach { public static void main(String[] args) { HashMap<String, String> hashmap = new HashMap<String, String>();//[1] hashmap.put("apple", "りんご");//[2] hashmap.put("orange", "みかん");//[3] hashmap.put("peach", "もも");//[4] hashmap.forEach((key, value) -> System.out.println("[5]キー:" + key)); hashmap.forEach((key, value) -> System.out.println("[6]値:" + value)); hashmap.forEach((key, value) -> System.out.println("[7]キー:" + key + " 値:" + value)); } } |
実行結果
1 2 3 4 5 6 7 8 9 |
[5]キー:orange [5]キー:apple [5]キー:peach [6]値:みかん [6]値:りんご [6]値:もも [7]キー:orange 値:みかん [7]キー:apple 値:りんご [7]キー:peach 値:もも |
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
このプログラムは、くだものの名前を3つ追加した後、forを使用してmapの値をすべて表示している。
- [1] HashMapクラスのオブジェクト、mapを生成する。
- [2] mapにキー:「apple」値:「りんご」を追加する。
- [3] mapにキー:「orage」値:「みかん」を追加する。
- [4] mapにキー:「peach」値:「もも」を追加する。
- [5] ラムダ式を使用して、mapのキーをすべて表示する。
- [6] ラムダ式を使用して、mapの値をすべて表示する。
- [7] ラムダ式を使用して、mapのキーと値をすべて表示する。
まとめ
このページではHashMapについてお伝えした。
連想配列として、キーとバリューをつなげたいときには便利に使えるクラスだ。サンプルプログラムも確認して、使えるようになっておこう。
コメント