概要
自主学習のアウトプットです。
現場でJavaのMapを操作していた時に、自分の書いたコードがまわりくどいやり方かなと思って調べたらいい方法を見つけたので備忘録です。(実際は周辺のコードと合わなくて使えませんでしたが。。)
学習中のKotlinとRubyで同じことするには?と調べたものも共有します。
まわりくどいやり方
コードを書いてふと思いました。
「なんやこれ、まわりくど」
思わず声に出てしまったコードがこちら
Map<String, String> pokemons = new HashMap<Srting, String>();
pokemons.put("Pikachu", "ピカチュウ");
pokemons.put("Lapras", "ラプラス");
pokemons.put("Snorlax", "カビゴン");
pokemons.put("Venusaur", "フシギバナ");
pokemons.put("Charizard", "リザードン");
pokemons.put("Blastoise", "カメックス");
Map<String, String> type = new HashMap<Srting, String>();
pokemons.put("ピカチュウ", "Electric");
pokemons.put("ラプラス", "Water");
pokemons.put("カビゴン", "Nomrmal");
pokemons.put("フシギバナ", "Gtass");
pokemons.put("リザードン", "Fire");
pokemons.put("カメックス", "Water");
List<String> waterPokemons = new ArrayList<>();
for (String englishName : pokemons.keySet()) {
if(StringUtis.isEqual(type.get(pokemons.get(englishName)), "Water")) {
waterPokemons.add(englishName);
}
}
System.out.println(waterPokemons.toString());
[Lapras, Blastoise]
要するにpokemonsというMapから水タイプのポケモンを抽出してListに詰めるというコードです。
if文の中でMapから2回valueを取り出してるのが綺麗じゃないな〜と個人的に思っていました。
かといってListに詰めるためにenglishNameは使いたいし。。。
entrySet()なるもの
調べたら便利なものを発見しました。
上のコードではsetKey()を使って拡張for文でMapのキーを繰り返し順番に使っていましたが
entrySet()を使うと、キーと値を同時に使うことができます。
「なんやこんなんあったんか」
思わず声に出てしまいました。
探せばもっといろんな便利なコードが見つかりそうですね。
まだまだ学習しないと!
entrySet()に修正したものがこちら
List<String> waterPokemons = new ArrayList<>();
for (Map.Entry<String, String> entry : pokemons.entrySet()) {
if(StringUtis.isEqual(type.get(entry.getValue(), "Water")) {
waterPokemons.add(entry.getKey());
}
}
処理自体は同じ結果ですが、Mapのキーだけを使って操作するよりわかりやすくてスッキリしてませんか??
こっちの方がMapの活用性をフルに使えている気がします!
以下にはMapの構造は上記を前提にしてKotlinとRubyではどう書くの?と調べたものものを載せていきます。
Kotlin
val waterPokemons = mutableListOf<String>()
pokemons.forEach{ it ->
if (type[it.value] == "Water") {
waterPokemons.add(it.key)
}
}
pokemonsというMapを引数にして、itで参照しています。
Kotlinの方が簡単に見えますね。
Ruby
waterPokemons = Array.new
pokemons.each do |key, value|
if type[key] == "Water"
waterPokemons.push(value)
end
end
Kotlinで書いたラムダ式と似ています。
こちらも分かりやすくて直感的で書きやすいです。
まとめ
結果は変わらなくとも、見やすさや書きやすさ、処理の速さなどを考慮すると便利なコードはたくさんありますね。
特にプログラムシステムにおいてMapはより拡張性を持たせてくれるものだと思っているので、Map操作はしっかりと身につけておきたい。。