转换列表:toIterator, toArray,copyToArray
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
举例:二路归并排序
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)