search
LoginSignup
29
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Organization

HashMapの総回し

PHPでの仕事が一段落したのでjavaのお勉強も並行して行なっていきます。
参考書はスッキリ分かるjava入門
実践編も買ってガンガン色んな問題等を解いていくのが学習効率いいのかな?
PHPのような便利関数が無い(?)ので、あれこれ苦労しながら勉強中。

とあるEラーニングサイトの問題にて、連想配列を使いたい問題が出てきたので
HashMapとやらを触ってみましたが、その中身を総当たりしようとすると、
色々やり方があるようなのでメモ。

例として、以下のHashMapを総当たりしてkeyとvalueを表示します。

example
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に変えるだけでいいんだ!なんて便利!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
29
Help us understand the problem. What are the problem?