PHPでの仕事が一段落したのでjavaのお勉強も並行して行なっていきます。
参考書はスッキリ分かるjava入門。
実践編も買ってガンガン色んな問題等を解いていくのが学習効率いいのかな?
PHPのような便利関数が無い(?)ので、あれこれ苦労しながら勉強中。
とあるEラーニングサイトの問題にて、連想配列を使いたい問題が出てきたので
HashMapとやらを触ってみましたが、その中身を総当たりしようとすると、
色々やり方があるようなのでメモ。
例として、以下のHashMapを総当たりしてkeyとvalueを表示します。
HashMap<String, Integer> map = new HashMap<String, Integer>();
for
Set<String> keys = map.keySet();
for (int i = 0; i < keys.size(); i++) {
String key = keys.toArray(new String[0])[i];
System.out.println(key + " => " + map.get(key));
}
意味は分かるけれどあまりスマートでは無いような気がします。
拡張for(foreach)
for (String key : map.keySet()) {
System.out.println(key + " => " + map.get(key));
}
かなりスマートになった気がしますし書きやすいですが、パッと見で意味分かるんかな…?
慣れてる人は読みやすいのかもしれません。
Iterator
for(Iterator<String> iterator = map.keySet().iterator(); iterator.hasNext(); ) {
String key = iterator.next();
System.out.println(key + " => " + map.get(key));
}
hasNext()
は次の要素が存在するときtrueになることを利用したループ。
そもそもIteratorの意味がよく理解できていないんだけれど、
「配列などの各要素に対する繰り返し処理の抽象化」とwikiには書かれている、
それってつまりforeach(拡張for)で済む話なんじゃなかろうか。
うーん?
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
というデータがあったときに1~10までの数字を全てメモリに持つか、
1から10までの1つずつをメモリに順番に入れていって、それぞれ処理をするか、の違いなのかな?
追記
entrySet
for (Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + " => " + entry.getValue());
}
Mapを回すときはkeySetよりも、entrySetの方が早いの記事を拝見して。
それぞれに利点があるんだろうな。まだ分からないけれど。
追記の追記
そして某Eラーニングサイトの問題は順番も指定されていたので、HashMapじゃダメのよう。
HashMapって順番不定なんだね。
追記の追記の追記
LinkedHashMap
に変えるだけでいいんだ!なんて便利!