转换列表: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)

scala编程第16章学习笔记(2)的更多相关文章

  1. scala编程第16章学习笔记(3)——List类的高阶方法

    列表间映射:map.flatMap和foreach 1.xs map f 操作返回把函数f应用在xs的每个列表元素之后由此组成的新列表.如: scala> List(1, 2, 3) map ( ...

  2. scala编程第16章学习笔记(1)

    List列表的基本操作 head方法获得列表的第一个元素 tail方法获得列表除第一个元素之外的其它元素 isEmpty:判断列表是否为空,空的话返回真 last:获得列表最后一个元素 init:获得 ...

  3. scala编程第16章学习笔记(4)——List对象的方法

    通过元素创建列表:List.apply List(1, 2, 3) 等价于List.apply(1, 2, 3): scala> List.apply(1, 2, 3) res0: List[I ...

  4. scala编程第19章学习笔记(1)——类型参数化

    一.queues函数式队列 函数式队列是一种具有以下三种操作方式的数据结构: head 返回队列的第一个元素. tail 返回除第一个元素之外的队列. scala> import scala.c ...

  5. scala编程第18章学习笔记——有状态的对象

    银行账号的简化实现: scala> class BankAccount{ | private var bal: Int = 0 | def balance: Int = bal | def de ...

  6. scala编程第17章学习笔记(4)——元组

    元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...

  7. scala编程第17章学习笔记(3)

    可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...

  8. scala编程第17章学习笔记(2)——集和映射

    默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...

  9. scala编程第17章学习笔记(1)——集合类型

    列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") ...

随机推荐

  1. 关于调用&&传址

    关于调用&&传址//数组int d1[];Function(int *d){} int main(){Function(d1);} //指针int *p;Function(int *q ...

  2. 过滤器中处理multipart/form-data头部的post请求request.getParameter(")获取不到参数问题

    如果不是文件类型请求,我们使用request.getParameter("");方法是可以获取到参数内容的,如果是文件类型的请求即请求的头部信息为“multipart/form-d ...

  3. Java 内部类.md

    Java 内部类 学习自 <Java编程思想> Overview 什么是内部类? Thinking In Java 中如此定义: 将一个类的定义放在里另一个类的定义的内部,这就是内部类. ...

  4. Xamarin iOS教程之申请付费开发者账号下载证书

    Xamarin iOS教程之申请付费开发者账号下载证书 Xamarin iOS使用真机测试应用程序 在讲解iOS Simulator时,已经提到了虽然iOS Simulator可以模仿真实的设备,但是 ...

  5. 怎样c# java md5值保持一致

    c#方式 /// <summary> /// 获得字符串md5. /// </summary> /// <param name="myString"& ...

  6. BZOJ4816 Sdoi2017数字表格

    一开始只推出O(TN)的做法,后来看了看发现再推一步就好了. 我们只需要枚举gcd就可以啦. 然后我们改变一下枚举顺序 设T为dk 预处理中间那部分前缀积就好了. #include<bits/s ...

  7. centos docker compose安装

    docker compose离线安装 通过联网机器下载docker-compose离线安装包(参见Downloads部分) https://github.com/docker/compose/rele ...

  8. CentOS 7下启动postfix服务报错:fatal: parameter inet_interfaces: no local interface found for ::1

    sed -i 's/inet_interfaces = localhost/inet_interfaces = all' /etc/postfix/main.cf service postfix re ...

  9. MikroTik RouterOS 6.x版本开始支持使用img镜像安装(U盘安装的终极解决方法)

    从6的rc6版本开始,官方已经提供了img镜像的安装方式,这让很多以前使用U盘安装的弊端一下子解放了,只需要把下载回来的img进入到PE,然后还原即可. 还原方法有很多:比如physdiskwrite ...

  10. Bootstrap datetimepicker “dp.change” 时间/日期 选择事件

    $('#<!--{$inputId}-->').datetimepicker({ todayHighlight: true, format: "YYYY-MM-DD<!-- ...