Androidエンジニアのゆーちゃまさんです^^
当サイト「ドロイドブログ」を運営しています。
Webアプリ開発3年、Androidアプリ開発を10年ほど今現在も現役です。
javaの勉強中の方で
- javaのmapの使い方がよくわからない。。
- 実際の開発での実例をしりたい
と思っているかた、多いと思います。
僕も勉強始めたころは、結局べんりなの?って感じでした。。
今回はスクールで勉強して、エンジニアになった現役エンジニアの僕が
初心者でもわかりやすく Mapの使い方を解説します!
勉強中だった当時の僕と同じように
- Mapの使い方がよくわかんない!
- 結局、何が便利なの?
といった悩みを解決します!
javaを勉強中のかた、いちど目を通してもらえるとうれしいです。
オンラインレッスン始めました!
zoomでのオンラインレッスンをはじめました^^
javaの基礎から、転職に関する相談、Androidアプリ開発・そのた幅広く対応します。
オンラインレッスン始めました!
zoomでのオンラインレッスンをはじめました^^
マンツーマンで対応しますので、自由に質問していただけます。
javaの基礎から、転職に関する相談、Androidアプリ開発・そのた幅広く対応します。
> Androidアプリの開発・プログラミング基礎を丁寧に教えます!
- マンツーマンでjava基礎を丁寧に解説
- Androidアプリ開発の方法・技術的な質問
- ITエンジニア転職の相談
- ITスクール選びで悩んでいる
など内容は幅広くたいおういたします^^
お気軽に相談してください!
結論:名前を指定してオブジェクトを取得できる
使いたいものを、名前を指定して取得できるのがポイント。
Listも便利ですが、特定のものを取得するにはfor文で中身をチェックしたりとあまり向いていません。
まずは使い方を解説します。
マップの使い方
Mapに登録と取得:put、get
1 2 3 4 5 6 | // マップを初期化(生成) finalHashMap<String,String>map=newHashMap<>(); // マップに登録 map.put("20210418","testデータ"); // マップから取得して出力 System.out.println("実行結果:"+map.get("20210418")); |

上のコードはコピーしやすいように、したの画像は見やすいように貼り付けました。内容は同じです。

1行目でHashMapを生成しています。
生成時に、key(名前)と実際にセットするオブジェクトを何にするのかを宣言する必要があります。
今回の場合、
- key(名前)は、String
- 登録するvalue(値)も、String
です。
オブジェクトは上記だとStringですが、なんでも登録できます。例えばInteger型でもOKですし、自分で作成したクラスでもOKです。
3行目で、putを使って値をセットしています。
keyが ”20210418” の文字列で
valueが “testデータ” の文字列になります。
5行目で、getでKeyを指定して取得してSystemOutで表示。


eclipseを利用しての実行結果になります。ちゃんと「testデータ」と表示されていますね
マップにkeyが存在するかチェック:containsKey(Object key)
Mapにデータが登録されている状態で、ある特定のデータがMapに入っているかの確認をしたいときがあります。
そんな時は 「containsKey(Object key)」を使えば一発で確認できます^^
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | publicstaticvoidmain(String[]args){ // Mapを初期化(生成) finalHashMap<String,String>map=newHashMap<String,String>(); // マップに登録 map.put("20210418","testデータ"); // マップから取得して表示 System.out.println("実行結果:"+map.get("20210418")); // containsKeyでデータの存在チェック if(map.containsKey("20210418")){ System.out.println("存在します!"); }else{ System.out.println("ありません!"); } } |


7行目で登録した「20210418」keyを、13行目であるかどうか「containsKey()」を使ってあるかどうか存在チェックしています。
存在チェック conteinsKey()
mapのkeyの存在チェックは conteinsKey(”key”)を使う!
存在する場合は true 、存在しない場合は false が返ってくる
マップに値が存在するかチェック:containsValue (Object key)
keyではなく、値(value)でも、マップにその値が存在するかチェックすることが出来ます。
containsValue(Object key)を使えばこちらも一発です!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | publicstaticvoidmain(String[]args){ // Mapを初期化(生成) finalHashMap<String,String>map=newHashMap<String,String>(); // マップに登録 map.put("キー1","testデータ1"); map.put("キー2","testデータ2"); map.put("キー3","testデータ3"); // 値がマップに存在するかチェック if(map.containsValue("testデータ1")){ System.out.println("存在します!!"); }else{ System.out.println("ありません!"); } } |

13行目でcontainsValue()を使用して、チェックしています。
mapの中に “testデータ1” が存在するかどうか?というチェック内容になります。
- 値がマップに存在する場合:true
- 値がマップに存在しない場合:false
Mapの要素を削除 clear() 、マップが空かどうかの判定は isEmpty()
Mapに登録したデータをすべて削除したい!
という場合は、clear()メソッド一発で削除できます^^
また、mapに何か登録されているかどうか。
マップが空かどうか?という判定は isEmpty()メソッドでチェックできます。
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 29 | publicstaticvoidmain(String[]args){ // Mapを初期化(生成) finalHashMap<String,String>map=newHashMap<String,String>(); // マップに登録 map.put("キー1","testデータ1"); map.put("キー2","testデータ2"); map.put("キー3","testデータ3"); System.out.println("clear実行前の空チェック"); // mapの空チェック if(map.isEmpty()){ System.out.println("mapは空です!!"); }else{ System.out.println("mapは空ではないです!!"); } // クリア実行 map.clear(); System.out.println("clear実行後の空チェック"); // クリア後のmapの空チェック if(map.isEmpty()){ System.out.println("mapは空です!!"); }else{ System.out.println("mapは空ではないです!!"); } } |

13行目で、clear実行前にマップの空チェックを判定しています。
「mapは空ではないです!!」と表示されましたね^^
この時点ではマップに3件のデータ登録がされている状態です。
20行目で clearメソッドを実行して、mapを空にしています。
24行目で、再度マップの空チェックを実行してみます。
「mapは空です!」と表示されました。
clearメソッドで登録されていたデータが全部消えていることがわかります^^
チェックポイント
Mapのデータ削除には 「clear」メソッドを使う!
Mapが空かどうかの判定には「isEmpty」メソッドを使用する!
すべてのkeyを取得はkeySet()、すべての値を取得するには values()を使おう
mapに登録されているkeyをすべて取得する場合、keySet()を利用。
逆にmapに登録されている値(value)を全部取得するには values()を使用します。
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 29 30 31 | publicstaticvoidmain(String[]args){ // Mapを初期化(生成) finalHashMap<String,String>map=newHashMap<String,String>(); // マップに登録 map.put("キー1","testデータ1"); map.put("キー2","testデータ2"); map.put("キー3","testデータ3"); // すべてのkeyを取得 System.out.println("keySetを利用してすべてのkeyを取得"); for(Stringkey:map.keySet()){ System.out.println("key:"+key); } // 全ての値を取得 System.out.println("\n"); System.out.println("valuesを利用してすべてkeyを取得"); for(Stringvalue:map.values()){ System.out.println("value:"+value); } // keySetを利用すれば、全てのデータを取得できる System.out.println("\n"); System.out.println("keySetを利用して値も取得する"); for(Stringkey:map.keySet()){ Stringvalue=map.get(key); System.out.println(key+"="+value); } } |

13行目で、keySetを利用してkeyを全部表示。
for文で順番に表示です。
System.out.println(“\n”) は改行です。単純に見やすくするために改行させてます。
18行目で valuesを利用して、値を全部表示。
使い方は簡単ですね^^
そしてポイントですが、keySetでkeyを全部取得できるので、そのまま値も取得できます。
valuesを利用するより、こちらの方がkeyも取得できるので利用する事が多いです。
チェックポイント
keySetを利用することで、keyをすべて取得できる。
valuesを使わなくても、keySetでkeyを取得時に値も全部取得することが出来て楽。
mapの空チェックする時は、nullチェックも忘れずにすること
isEmpty()メソッドでmapが空かどうかのチェックは出来ることが分かりました。
だだし、mapがnullの場合はNullPointerException例外が発生します!

何も参照していない状態がnull。そんなnullの状態の変数のメソッドを使用するとヌルぽが発生しちゃいます!
NullPointerExceptionが発生する理由はとっても大事です!!!
もし自信の無い方は、今の内に理解しておきましょう!
⇒ ⇒ ⇒ 【プログラム勉強中】NullPointerException ぬるぽをちゃんと理解しよう!
ということで、nullチェック必ず一緒に実施しましょう!
1 2 3 4 5 | // nullチェックも同時にすること! // mapが空では無い事を確認したい場合 if(map!=null&&!map.isEmpty()){ System.out.println("mapはデータ登録があります!"); } |

こんな感じで4行目でマップが空では無かった場合にやりたい処理を記述!
【実例】カレンダー作成時に使用

Anroid開発になってしまいますが、特に他と変わりはないです。
カレンダーの機能を開発しているとします。
簡単にしていますが、以下の仕様を満たす必要があるとしますね。
- カレンダーの日にちを選択したら、選択した日付を赤色にする
- 既に選択していた日付を赤から黒にもどす
まず、カレンダー作成時に各日付のViewをyyyyMMdd、20210418のような名前(key)でmapに全て登録しておきます。
そして日付選択時に、選択した日付をyyyyMMddの文字列として保持しておく。
仮に「20210410」としますね。
そして、選択した日付はそのまま赤字に。

ここからがポイントです!
再度別の日付を選択した場合、まず前回選択していた日付を赤字から黒字に戻す必要があります。
保持していた文字列、yyyyMMdd「20210410」をkeyにmapから前回選択していたViewを取得します。
そして取得した前回選択Viewの文字列を赤字から黒字にもどす。
あとは、今回選択した日付を赤字に。
そして同様に、今回選択の日付を文字列で保持しておく。
この繰り返しで、選択した日付を赤字に、前回選択していた日付を黒字にすることができます。

ポイントは前回選択していたViewをmapから名前(今回はyyyyMMdd)ですぐに取得できるという部分になります。
リストで実現するには、毎回for文でListを繰り返しチェックする必要ができてしまいます。
マップだと簡単ですね^^
この簡単な仕様だと、前回の日付Viewをそのまま保持しておけば問題ないです。
しかし、実際の仕様だともう少し複雑で開始日と終了日に色を付けたり、間の日付にも線を引くなどの細かい仕様がありました。
ですので、選択日付だけでなく同時に他の日付オブジェクトも複数取得する必要があり、そのすべてを毎回保持しておくのは大変です。
マップに一括登録しておけば、いつでも取得したい日付オブジェクトをyyyMMddで取得できて便利で楽になる。
この方が処理の書き方もスッキリとします^^
まとめ
少し複雑でしたが、ポイントは名前(key)を指定することで、必要なオブジェクトを簡単に取得できる部分になります^^
色んな機能を紹介・解説しましたが、
- putでkeyとvalueを指定して、データを登録
- getでkeyを指定してデータを取得

この2つを覚えておけばOK!!困ることはないです、まじで!他の機能は必要な時にググればすぐに出てきますからね^^
ぶちゃけ、他の機能ってあまり使わないんですよね。
データを登録しておいて、必要な時にとりだすことができればOK!
チェックポイント
getとputだけ覚えておけば、ほとんど困らない!
マップを使うことが出来れば、開発する手段の引き出しが増えて非常に楽になります。
開発する時に常に、ここはマップを使えないだろうか?と考えるとスキルアップのスピードが上がります。
マップをガンガン使って使い方を覚えてちゃいましょう!!
こちらの記事もどうぞ^^
⇒ ⇒ ⇒ 【Java/Kotlin】ArrayList使い方・入門 リストを使いこなそう!
⇒ ⇒ ⇒ 【java 配列の基礎】配列はこれだけ覚えておけばOK!徹底解説。
⇒ ⇒ ⇒ 【プログラム勉強中】NullPointerException ぬるぽをちゃんと理解しよう!
⇒ ⇒ ⇒ 【pagespeed insights 改善】2021年度版 モバイルスピードを速くするためにやった3つのこと
コメント