プログラミングと資産運用な日々

プログラミングと資産運用が中心の雑記ブログです。

ScalaのMapとforeachの使い方

さて、今日はScala言語のMap関数、foreach関数の使い方を学習してみたいと思います。

ぼくも勉強がてらこの記事を書いています。

一緒に勉強していきましょう!

 

f:id:toyo--104:20181129235153j:plain

 

Mapって要は連想配列

まずはMapから!Mapって聞き慣れないのですが、Scalaではよく使う便利な関数みたいで、最初はなんとなく敬遠していました。

 

が、プログラミング経験者ならなんてことはない。連想配列なんです!

 

連想配列がわからない人は是非ググってほしいんですが(そういう人はあんまりScalaから始めないと思うけど・・・)、ざっくり言うと、キーと値が対になったセットの固まりです。

 

下の例を見て下さい。Mapで連想配列を生成して、キー「1つ目」に、「りんご」、キー「2つ目」に「ゴリラ」、キー「3つ目」に「ラッパ」を入れています。

 

取り出すには、変数名(キー名)です。 

object MapTest {
  def main(args: Array[String]): Unit = {
    val map = Map("1つ目" -> "りんご", "2つ目" -> "ゴリラ", "3つ目" -> "ラッパ")
    println(map("1つ目"))
    println(map("2つ目"))
    println(map("3つ目"))
  }
}

 

これを実行してみると、順番にprintされました。とてもカンタンですね。

f:id:toyo--104:20181129235727p:plain

 

foreachで連想配列の要素を取り出し

さて、Mapで連想配列を作ったら、その連想配列の要素全部にアクセスするのがforeachです

 

連想配列.foreachで中身のkey、valueにアクセスできます。

「_」が各ループの要素を表します。実物見たほうがわかりやすいので、下の例をどうぞ!

object MapTest {
  def main(args: Array[String]): Unit = {
    val map = Map("1つ目" -> "りんご", "2つ目" -> "ゴリラ", "3つ目" -> "ラッパ")
map.foreach( println(_) )
} }

 

 実行結果はこちら。

f:id:toyo--104:20181130000628p:plain

 

でも、これだと()がついてて今ひとつ使えないですね。

この()のことをタプルと言います。

タプルを取り出すには、「タプル._1」でキーを取り出し、「タプル._2」で値を取り出しになります。 

 

で、「print(_._1)」と書いてみたら怒られました。理由は不明です。

ですので、次の項目で説明する無名関数を作って、その中で処理をしていこうと思います。

 

ちなみに、なぜ無名関数を作るかと言うと、foreachの()の中に処理を長々と書くことができないからです。printだったら怒られないんですが。。

 

foreachの処理に無名関数を書く

さて、ではforeachの処理の中に、print文だけでなく処理を書くための無名関数を追加してましょう。

早速サンプルコードです。

object MapTest {
  def main(args: Array[String]): Unit = {
    val map = Map("1つ目" -> "りんご", "2つ目" -> "ゴリラ", "3つ目" -> "ラッパ")

    map.foreach({ i=>
      println(i._1)
      println(i._2)
    })
    
  }
}

 

foreachの()の中に、{}でくくって処理を書きます

i」がここでは、各ループで渡される要素(タプル)を表します。

 先程説明したように、タプルは「タプル._1」でキーを取り出し、「タプル._2」で値を取り出しなので、「i._1」、「i._2」となっています。

 

結果はこんな感じです。キー、値、キー、値、キー、値 と上から6つprintlnされていますね!

f:id:toyo--104:20181130001720p:plain

 

簡単な例から進めていきましょう

Scalaの解説ページ、何をググっても理屈っぽくて難しいので、極力簡単な例を出して説明してみました。どうたったでしょう?

 

Map、foreachなど、連想配列系の処理は多用すると思いますので、まずは基礎からしっかり理解した方がいいでしょう。

 

ぼくもこのページを見返しながら、実装していきたいと思います。