第16章 使用列表(一)

List类型

列表是同质的:列表的所有元素都具有相同的类型。元素类型为T的列表写成List[T]
列表类型是协变的:对于每一对类型S和T来说,如果S是T的子类,那么List[S]是List[T]的子类型。

列表的基本操作

head : 返回列表的第一个元素

tail : 返回除第一个之外所有元素组成的列表

isEmpty:如果为空,返回true

前两个仅能够作用在非空列表上。

用模式匹配实现插入排序的代码:

 1 def isort(xs : List[Int]) : List[Int] = xs match{
2 case List() => List()
3 case x :: xs1 => insert(x , isort(xs1))
4 }
5
6 def insert(x : Int , xs : List[Int]) : List[Int] = xs match{
7 case List() => List(x)
8 case y :: ys => if ( x <= y ) x :: xs
9 else y :: insert(x ,ys)
10 }

模式匹配。其中 :: 左边的加到右边的前面,组成新的List。

List类的一阶(first-order)方法 

  一阶方法是指不以函数做入参的方法。

* 连接列表:是一种与 :: 接近的操作,写做“:::”,不同的是两个操作元都是列表。xs ::: ys的结果是依次包含xs和ys所有元素的新列表。如:List(1,2) ::: List(3,4,5)   res: List[Int] = List(1,2,3,4,5)。同样也是右结合。即从右往左运算

* 分治原则:

  分:先用模式匹配把输入列表拆分为更简单的样本,然后根据每个样本构建结果。

  治:如果结果是非空列表,那么一块块部件将通过同样的递归遍历自满构建出来。

* 列表的长度:length。因为要遍历整个列表来找到尾部,所以比较费时。因此,在判断一个列表是否为空时,最后采用xs.isEmpty而不是用length==0 来判断

* 访问列表尾部:init方法和last方法。init得到除了最后一个元素以外的所有元素;last得到最后一个元素。 同样不能用于空列表。

注意:组织好数据,以便让所有的访问都集中在列表的头部,而不是尾部。

* 反转列表:reverse 方法。它是创建了新的列表而不是对原列表进行操作。

* 前缀后缀和splitAt:take返回xs列表的前N个元素,drop返回xs列表除了前N个元素之外的所有元素。splitAt操作在指定位置拆分列表,并返回对偶列表(元组形式)

* 元素选择:apply方法和indices方法。apply方法简单定义为drop和head的组合,即:xs apply n 等价于 (xs drop n).head。indices方法可以返回指定列表的所有有效索引组成的列表。

* 啮合列表:zip。可以把两个列表组成一个对偶列表。常用到的情况是把列表元素与索引啮合在一起。这时使用zipWithIndex方法会更为有效。

* 显示列表:toString和mkString方法。 mkString方法格式为:xs mkString (pre , sep , post)。其中,pre为列表的前缀,sep为每两个元素之间插入的字符串,post为在最后的后缀字符串。有两种变体,一:省略前后两个部分,只保留中间的字符串;二:忽略所有的参数。还有名为addString的变体,可以把构建好的字符串添加到StringBuilder

*  转换列表:elements,toArray,copyToArray。如果需要用枚举器访问列表元素,就可以用elements方法,得到Iterator

举例为归并排序。还没看懂。应该就是二分排序的意思吧?涉及分治原则及柯里化,因此还要把以前的知识点再回头看一下。

 



你可能感兴趣的:(使用)