HashMap,forでググってきてる方へ
HashMap,forでググってきてる人が多いようなので追記しておきます。オリジナルはほとんど意味がないので...
JavaのHashMapでforをまわすと以下のようになります.
HashMap<String, String> hash = new HashMap<String, String>(); for (Map.Entry entry : hash) { // entry.getKey() => キー // entry.getValue() => 値 }
Map.Entryはキーと値のコンテナです.HashMapはMap.Entryの配列だとイメージしてもらうといいです(厳密には違います).HashMapに保存されている値を順にentryで取得できるので,いい感じに処理してください.
Map<key, Entry>ってなんや!ってなったアナタ,Genericsについてググりましょう.
オリジナルは以下
Javaの拡張for文が非常に気持ち悪い.
HashMapのオブジェクトの格納している要素全てになにかしたいと思うと,スクリプト言語でいうfor inとかforeachみたいなfor文を書くことになる.
けど,自分が知っていたJavaのforはC的なもので,そういうのできねーのかなあ?ってググってみると,
for (int i : array)
みたいに書けることがわかって,こりゃ便利!ととりあえずこんな感じに書いてみた.
HashMap<String, String> hash = new HashMap<String, String>(); for (String str : hash) { // ごにゃごにゃ }
するとfor文でエラーが出た.
ハァ?とか思いながら調べてみると,どうやらHashMapを直接渡してしまっているのがダメっぽい.
そこで,
for (String str : hash.keySet()) { // ごにゃごにゃ }
とするとすんなりいった.
今まで使ったことがある拡張for文は与えたハッシュのキーを勝手にとってきてくれていたから,それが普通だと思い込んでいた.
Javaではちゃんとキーのリストはこれですよーと教えてあげないといけない.
だからHashMapにはkeySet()とかvalues()というメソッドがあって,オブジェクトの持つキーや要素を全部返してくれる.
けど,ハッシュと拡張for文のメリットは,オブジェクトが格納してるキーが未知でも走査できることだと思うし,キーのリストを教えてあげないといけないのは変だと思う.
むしろkeySet()やvalues()でキーやらで要素のリストを返してしまったら,危なくねーのかなあ,とさえ.
こういうふうに無駄なことをいちいちしないといけないからJavaってあんまりおもしろくないのかな?
- keySet()をkeys()と勘違いしていたので修正しました.