十四、Scala 中的集合之 List
Nil
其实就是一个空的不可变的 List
scala> Nil
res16: scala.collection.immutable.Nil.type = List()
Scala
的 List
与 Array
非常相似,列表的所有元素都具有相同的类型,
但有两个重要的区别:
- 首先,列表是不可变的,列表的元素不能通过赋值来更改
- 其次,列表 具有递归的结构(也就是链接表结构)而数组不是
具有类型 T
的元素的列表的类型被写为 List[T]
。
一、定长的List
对 List 进行操作,会产生一个新的 List,原来的 List 并没有改变
(1)定义
scala> val l = List(1,2,3,4,5)
l: List[Int] = List(1, 2, 3, 4, 5)
一个 List
由 head
和 tail
组合成的
第一个元素就是 head
,其余都是 tail
scala> l.head
res17: Int = 1
scala> l.tail
res18: List[Int] = List(2, 3, 4, 5)
(2)使用 :: 连接,语法:head :: tail
scala> val l2 = 1 :: Nil // 把 1 当作 head,把Nil 当作tail,把它们拼成一个新的List
l2: List[Int] = List(1)
scala> val l3 = 2 :: l2
l3: List[Int] = List(2, 1)
scala> val l4 = 1 :: 2 :: 3 :: Nil
l4: List[Int] = List(1, 2, 3)
(3)使用 List.concat() 连接
scala> la
res89: List[Int] = List(1, 2, 3)
scala> lb
res90: List[Int] = List(4, 5, 6)
scala> List.concat(la, lb)
res91: List[Int] = List(1, 2, 3, 4, 5, 6)
(4)查看长度
scala> l.length
res19: Int = 5 // 长度为5,所以他也是定长的
(5)翻转
scala> la
res93: List[Int] = List(1, 2, 3)
scala> la.reverse
res94: List[Int] = List(3, 2, 1)
(6)tabulate
List.tabulate() 方法是通过给定的函数来创建列表。
- 第一个参数为元素的数量,可以是二维的
- 第二个参数为指定的函数,我们通过指定的函数计算结果,并返回值插入到列表中,起始值为 0
// 通过给定的函数创建 4 个元素
val la = List.tabulate(4)(n => n * n)
println("la : " + la)
// 创建二维列表
val lb = List.tabulate(3, 4)(_ * _)
println("lb : " + lb)
输出
la : List(0, 1, 4, 9)
lb : List(List(0, 0, 0, 0), List(0, 1, 2, 3), List(0, 2, 4, 6))
二、变长的 ListBuffer
对 ListBuffer
进行操作,就是对原来的 ListBuffer
进行操作,不会新生成 ListBuffer
scala> val l5 = scala.collection.mutable.ListBuffer[Int]()
l5: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
(1)追加
ListBuffer
支持尾部追加
scala> l5 += 2
res24: l5.type = ListBuffer(2)
scala> println(l5)
ListBuffer(2)
scala> l5 += (3,4,5)
res26: l5.type = ListBuffer(2, 3, 4, 5)
scala> l5 ++= List(6,7,8,9)
res27: l5.type = ListBuffer(2, 3, 4, 5, 6, 7, 8, 9)
(2)删除
指定元素删除
scala> l5 -= 2
res29: l5.type = ListBuffer(3, 4, 5, 6, 7, 8, 9)
scala> l5 -= (1,4)
res30: l5.type = ListBuffer(3, 5, 6, 7, 8, 9)
scala> l5 --= List(3,5,6)
res32: l5.type = ListBuffer(7, 8, 9)
三、类型转换
scala> l5 += (4,5,6,7)
res40: l5.type = ListBuffer(4, 5, 6, 7)
scala> l5.toList
res41: List[Int] = List(4, 5, 6, 7)
scala> l5.toArray
res42: Array[Int] = Array(4, 5, 6, 7)
四、三个基本操作
- head 返回列表第一个元素
- tail 返回一个列表,包含除了第一元素之外的其他元素:(是一个列表或者Nil)
- isEmpty 在列表为空时返回true
scala> l5.isEmpty
res45: Boolean = false
scala> l5.tail
res46: scala.collection.mutable.ListBuffer[Int] = ListBuffer(5, 6, 7)
scala> l5.tail.head
res47: Int = 5
五、一个求和的例子
def sum(nums: Int*): Int = {
if (nums.length == 0){
0
}else{
// 这是一个递归
nums.head + sum(nums.tail:_*) // :_* 可以把seq转成可变参数
}
}
println(sum())
println(sum(1,2,3,4))
输出
0
10