【Scala】リストと関数

前回と同じページを使って学習

(http://bach.istc.kobe-u.ac.jp/lect/ProLang/org/scala-list.html)

今回は4.リストと関数

リストに関連する関数をざーっとやります

 


リストの要素に関数を加えた新しいリストを求めることが簡単にできる。

そう、Scalaならね。

例えば、リストの要素にそれぞれ+1をしたいってとき

var list = (1 to 5).toList
def inc(x:Int) = x + 1
list.map(inc)
list: List[Int] = List(1, 2, 3, 4, 5)
inc: (x: Int)Int
res: List[Int] = List(2, 3, 4, 5, 6)

こんなふうに。

また、Scalaの場合はわざわざ定義しなくても関数を使える

scala> list.map(x => x + 1)
res: List[Int] = List(2, 3, 4, 5, 6)

xが引数、x+1が本体の名無し関数(匿名関数という)。

さらにさらに、アンダーバー( _ )を用いると引数も省略できる。

scala> list.map(_ + 1)
res: List[Int] = List(2, 3, 4, 5, 6)

手間のかかり方がダンチ。

という訳で関数を引数とするmapと愉快なメソッドたちを紹介


  • map(f) リストx1, x2, ... xnに対してf(x1), f(x2), ... f(xn) とするリストを求める
scala> list.map(_ > 2)
res: List[Boolean] = List(false, false, true, true, true)


  • filter(f) リストx1, x2, ...に対してf(xi)が真になるリストを求める
scala> list.filter(_ > 2)
res: List[Int] = List(3, 4, 5)


  • count(f) リストx1... に対してf(xi)が真になる要素の個数を求める
scala> list.count(_ > 2)
res: Int = 3


  • forall(f) リストの要素全てに対して真になるとき真を返す
scala> list.forall(_ > 0)
res: Boolean = true

scala> list.forall(_ > 1)
res: Boolean = false

AND感覚でどうぞ

  • exists(f) リストの要素のいずれかが真になるとき真を返す
scala> list.exists(_ > 1)
res: Boolean = true

こちらはORみたいな感じ

  • indexWhere(f) リストに対して最初にf(xi)が真になったときのiを返す
scala> list.indexWhere(_ > 1)
res: Int = 1


  • sortWith(f) 比較関数fを用いてソートしたリストを求める
scala> list.sortWith((a,b) => a > b)
res: List[Int] = List(5, 4, 3, 2, 1)

scala> list.sortWith(_ > _)
res: List[Int] = List(5, 4, 3, 2, 1)


  • sortBy(f) 関数fの結果を昇順でソートしたリストを求める
scala> list.sortBy(a => -a)
res: List[Int] = List(5, 4, 3, 2, 1)

scala> list.sortBy(-_)
res: List[Int] = List(5, 4, 3, 2, 1)

あくまで返すのはもとの要素で構成されたリスト

それでは今回もこれらを使って遊んでみます

3番目以降の要素は2乗する
scala> list.map(a => if (a > 2) a * a else a)
res: List[Int] = List(1, 2, 9, 16, 25)


リストの要素の最大値が何番目にあるかを調べる
scala> list = List(2, 4, 8, 5)
list: List[Int] = List(2, 4, 8, 5)

scala> list.indexWhere(_ == list.max)
res: Int = 2


リストの各要素を倍返しする
scala> list.map(_ * 2)
res: List[Int] = List(2, 4, 6, 8, 10)

やられたらやり返す

いい感じのが思いつきませんでした、悔しい

なにはともあれ map OP