scalaプログラミング第16章学習ノート(3)——List類の高次方法

5553 ワード

リスト間マッピング:map、flatMap、foreach
1.xs map f操作は、xsの各リスト要素に関数fを適用した後に構成される新しいリストを返す.次のようになります.
scala> List(1, 2, 3) map (_ + 1)

res0: List[Int] = List(2, 3, 4)



scala> val words = List("the", "quick", "brown", "fox")

words: List[String] = List(the, quick, brown, fox)



scala> words map (_.length)

res1: List[Int] = List(3, 5, 5, 3)



scala> words map (_.toList.reverse.mkString)

res2: List[String] = List(eht, kciuq, nworb, xof)

2.flatMapオペレータはmapと似ていますが、右のオペレータは要素リストを返すことができる関数です.リストの各要素にメソッドを呼び出し、すべてのメソッドの結果を接続して返します.mapとflatMapの違いは、以下のように例示される.
scala> words map (_.toList)

res3: List[List[Char]] = List(List(t, h, e), List(q, u, i, c, k), List(b, r, o,

w, n), List(f, o, x))



scala> words flatMap (_.toList)

res4: List[Char] = List(t, h, e, q, u, i, c, k, b, r, o, w, n, f, o, x)

List.rangeは、ある範囲内のすべての整数リストを作成できるツールメソッドです.例:
scala> List.range(1, 5) flatMap (i => List.range(1, i) map (j => (i, j)))

res6: List[(Int, Int)] = List((2,1), (3,1), (3,2), (4,1), (4,2), (4,3))

3.foreachはマッピングと同様の3番目の操作です.その右オペランドはプロシージャ(Unitを返す関数)です.リスト要素ごとにプロシージャを呼び出すだけです.操作の結果はUnitのままであり、結果リストは生成されません.例:
scala> var sum = 0

sum: Int = 0



scala> List(1, 2, 3, 4, 5) foreach (sum += _)



scala> sum

res9: Int = 15

リストフィルタ:filter、partition、find、takeWhile、dropWhile、span 1.xs filter p操作は、xs中のp(x)がtrueであるすべての要素に合致するリストを生成する.次のようになります.
scala> List (1, 2, 3, 4, 5) filter (_ % 2 == 0)

res10: List[Int] = List(2, 4)



scala> words filter (_.length == 3)

res11: List[String] = List(the, fox)

2.partitionメソッドはfilterと似ていますが、リストペアが返されます.1つはすべての論断が真である要素を含み、もう1つはすべての論断が偽である要素を含む.xs partition pは(xs filter p,xs filter(!p()に等しい)
例を次に示します.
scala> List(1, 2, 3, 4, 5) partition (_ % 2 ==0)

res12: (List[Int], List[Int]) = (List(2, 4),List(1, 3, 5))

3.findメソッドはfilterメソッドと同様であるが,与えられた論断を満たす最初の要素を返し,すべてではない.xs find p操作はリストxsと論断pを操作元とする.オプション値を返します.xsに要素xが存在してp(x)が真である場合、Some(x)は返される.そうでなければ、p対のすべての要素が成立しない場合、Noneは戻ります.例を次に示します.
scala> List(1, 2, 3, 4, 5) find (_ % 2 == 0)

res13: Option[Int] = Some(2)



scala> List(1, 2, 3, 4, 5) find (_  <= 0)

res15: Option[Int] = None

4.xs takeWhile pオペレーションは、リストxsの中で最も長いpを満たすことができるプレフィックスを返す.例:
scala> List(1, 2, 3, -4, 5) takeWhile (_ > 0)

res16: List[Int] = List(1, 2, 3)

5.xs dropWhile p操作は、最も長い間pのプレフィックスを満たすことができることを除去する.例を次に示します.
scala> words dropWhile (_ startsWith "t")

res17: List[String] = List(quick, brown, fox)

6.spanメソッドはtakeWhileとdropWhileを1つの操作に組み合わせる.xs span pは(xs takeWhile p,xs dropWhile p)に等しいと定義されたペアのリストを返します.
scala> List(1, 2, 3, -4, 5) span (_ >0)

res18: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5))

リストの論断:forallとexists
1.xs forall pリストのすべての要素がpを満たす場合はtrueを返します.
2.xs exists pリストにpを満たす値がある場合はtrueを返します.
たとえば、リストのリスト形式で表される行列にゼロの行があるかどうかを指定します.
scala> def hasZeroRow(m: List[List[Int]]) = m exists (row => row forall (_ == 0))

hasZeroRow: (m: List[List[Int]])Boolean



scala> val m= List(List(3,0,0), List(0,3,0), List(0,0,3))

m: List[List[Int]] = List(List(3, 0, 0), List(0, 3, 0), List(0, 0, 3))



scala> hasZeroRow(m)

res21: Boolean = false

折りたたみリスト:/:および:
scala> def sum(xs: List[Int]): Int = (0 /: xs) (_ + _)

sum: (xs: List[Int])Int

sum(List(a,b,c))は0+a+b+cに等しい
scala> def product(xs: List[Int]): Int = (1 /: xs) (_ * _)

product: (xs: List[Int])Int

Product(List(a,b,c))は、1*a*b*cの左折り畳み操作「(z/:xs)(op)」に等価であり、開始値z、リストxs、および2元操作opの3つのオブジェクトに関連する.折り畳まれた結果opは、接頭辞値zおよび各隣接要素に適用される.
:オペレータは右折りと呼ばれます.左折り畳みと同様に3つのオペランドがありますが、最初の2つの出現順序は逆です.最初のオペランドは折り畳まれるリストで、2番目は開始値です.(xs\: z) (op)
リストのソート:sortWith
リストxsの操作に対して、xs sortWith beforeは、リストの要素をソートすることができ、「before」は要素を比較する方法である.例を次に示します.
scala> List(1, -3, 4, 2, 6) sortWith (_ < _)

res2: List[Int] = List(-3, 1, 2, 4, 6)

scala> words sortWith (_.length > _.length)

res5: List[String] = List(quick, brown, the, fox)