yashigani?.days

週刊少年ジャンプについてだらだら書きます

Javaの拡張for文

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()と勘違いしていたので修正しました.