scalaプログラミング第16章学習ノート(2)
4232 ワード
変換リスト:toIterator,toArray,copyToArray
ListクラスのtoArrayメソッドは再帰的に格納されたリストを連続的に格納された配列に変換する
ArrayクラスのtoListメソッドは連続的に格納された配列を再帰的に格納されたリストに変換する
copyToArrayメソッドでは、リスト要素をターゲット配列の連続空間にコピーできます.操作:xs copyToArray(arr,start)
リストxsのすべての要素を配列arrにコピーし、埋め込み位置がstartになります.ターゲット配列arrにすべてのリスト要素を置くのに十分なスペースがあることを確認する必要があります.
列挙器でリスト要素にアクセスする必要がある場合は、toIteratorメソッドを使用します.
例:2ウェイ集計ソート
実行例:
1.正規配列
2.逆配列
ListクラスのtoArrayメソッドは再帰的に格納されたリストを連続的に格納された配列に変換する
ArrayクラスのtoListメソッドは連続的に格納された配列を再帰的に格納されたリストに変換する
scala> val arr = abcde.toArray
arr: Array[Char] = Array(a, b, c, d, e)
scala> arr.toList
res24: List[Char] = List(a, b, c, d, e)
copyToArrayメソッドでは、リスト要素をターゲット配列の連続空間にコピーできます.操作:xs copyToArray(arr,start)
リストxsのすべての要素を配列arrにコピーし、埋め込み位置がstartになります.ターゲット配列arrにすべてのリスト要素を置くのに十分なスペースがあることを確認する必要があります.
scala> val arr2 = new Array[Int](10)
arr2: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
scala> List(1, 2, 3) copyToArray (arr2, 3)
scala> arr2
res27: Array[Int] = Array(0, 0, 0, 1, 2, 3, 0, 0, 0, 0)
列挙器でリスト要素にアクセスする必要がある場合は、toIteratorメソッドを使用します.
scala> val it = abcde.toIterator
it: Iterator[Char] = non-empty iterator
scala> it.next
res28: Char = a
scala> it.next
res29: Char = b
例:2ウェイ集計ソート
object MergeSort extends App {
/**
* @author DELL
*
*
*/
def msort[T] (less: (T, T) => Boolean) //less (xs: List[T]): List[T] = {
/**
* @param xs
* @param ys
* @return
*/
def merge(xs: List[T], ys: List[T]): List[T] =
(xs, ys) match {
case (Nil, _) => ys
case (_, Nil) => xs
case (x :: xsl, y :: ysl) =>
if (less(x, y)) x :: merge(xsl, ys)
else y :: merge(xs, ysl)
}
val n = xs.length / 2
if (n == 0) xs
else {
val (ys, zs) = xs splitAt n // xs
merge(msort(less)(ys), msort(less)(zs)) // ,
}
}
}
実行例:
1.正規配列
scala> msort((x: Int, y: Int) => x < y) (List (5, 7, 1, 3))
res0: List[Int] = List(1, 3, 5, 7)
2.逆配列
scala> val reversemsort=msort((x: Int, y: Int) => x > y) _
reversemsort: List[Int] => List[Int] = <function1>
scala> reversemsort(List(5, 7, 3, 1))
res3: List[Int] = List(7, 5, 3, 1)