scala编程第16章学习笔记(2)
转换列表: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)的更多相关文章
- scala编程第16章学习笔记(3)——List类的高阶方法
列表间映射:map.flatMap和foreach 1.xs map f 操作返回把函数f应用在xs的每个列表元素之后由此组成的新列表.如: scala> List(1, 2, 3) map ( ...
- scala编程第16章学习笔记(1)
List列表的基本操作 head方法获得列表的第一个元素 tail方法获得列表除第一个元素之外的其它元素 isEmpty:判断列表是否为空,空的话返回真 last:获得列表最后一个元素 init:获得 ...
- scala编程第16章学习笔记(4)——List对象的方法
通过元素创建列表:List.apply List(1, 2, 3) 等价于List.apply(1, 2, 3): scala> List.apply(1, 2, 3) res0: List[I ...
- scala编程第19章学习笔记(1)——类型参数化
一.queues函数式队列 函数式队列是一种具有以下三种操作方式的数据结构: head 返回队列的第一个元素. tail 返回除第一个元素之外的队列. scala> import scala.c ...
- scala编程第18章学习笔记——有状态的对象
银行账号的简化实现: scala> class BankAccount{ | private var bal: Int = 0 | def balance: Int = bal | def de ...
- scala编程第17章学习笔记(4)——元组
元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> ...
- scala编程第17章学习笔记(3)
可变(mutable)集合与不可变(immutable)集合 为了更易于完成不可变集合到可变集合的转换,或者反向转换,Scala提供了一些语法糖.纵使不可变集和映射并不支持真正的+=方法,Scala还 ...
- scala编程第17章学习笔记(2)——集和映射
默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变 ...
- scala编程第17章学习笔记(1)——集合类型
列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") ...
随机推荐
- Java反射初探 ——“当类也学会照镜子”
反射的作用 开门见山地说说反射的作用 1.为我们提供了全面的分析类信息的能力 2.动态加载类 我理解的“反射”的意义 (仅个人理解哈) 我理解的java反射机制就是: 提供一套完善而强大的 ...
- [转]01分数规划算法 ACM 二分 Dinkelbach 最优比率生成树 最优比率环
01分数规划 前置技能 二分思想最短路算法一些数学脑细胞? 问题模型1 基本01分数规划问题 给定nn个二元组(valuei,costi)(valuei,costi),valueivaluei是选择此 ...
- 最长子回文字符串(Manacher’s Algorithm)
# # 大佬博客: https://www.cnblogs.com/z360/p/6375514.html https://blog.csdn.net/zuanfengxiao/article/det ...
- 详解django三种文件下载方式
推荐使用FileResponse,从源码中可以看出FileResponse是StreamingHttpResponse的子类,内部使用迭代器进行数据流传输. 在实际的项目中很多时候需要用到下载功能,如 ...
- BZOJ.4456.[ZJOI2016]旅行者(分治 Dijkstra)
题目链接 \(Description\) 给定\(n\times m\)的带边权网格图.\(Q\)次询问从点\((x_i,y_i)\)到点\((x_j,y_j)\)的最短路. \(n\times m\ ...
- 吴恩达-coursera-机器学习-week6
十.应用机器学习的建议(Advice for Applying Machine Learning) 10.1 决定下一步做什么 10.2 评估一个假设 10.3 模型选择和交叉验证集 10.4 诊断偏 ...
- 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)
2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6 比赛连接: http://codeforces.com/gym/101124/ ...
- 国内代码托管git-osc基础使用教程
git-osc是开源中国社区团队推出的基于Git的快速的.免费的.稳定的在线代码托管平台,不限制私有库和公有库数量.国内同类的有taocode.SVNchina等等 个人更喜欢git-osc的界面与操 ...
- oracle 两个逗号分割的字符串 如何判断是否其中有相同值
比如字段A: 'ab,cd,ef,gh'字段B: 'aa,bb,cc,dd' 没有相同值 字段A: 'ab,cd,ef,gh'字段B: 'aa,bb,cd,dd' 有相同值cd 1.CREATE OR ...
- 关于C++类型检查的一点小挫折
问题: 定义了一个float型数组Lut[],我让一个整型指针指向数组名int * Address=lut ; VS2008报错: error C2440: '=' : cannot conv ...