第五课 尚硅谷Scala语言学习-常用集合类型学习
第一节 集合类型简介
- Scala 的集合有三大类:序列 Seq、集 Set、映射 Map,所有的集合都扩展自 Iterable特质。
- 对于几乎所有的集合类,Scala 都同时提供了可变和不可变的版本,分别位于以下两个包
- 不可变集合:scala.collection.immutable
- 可变集合: scala.collection.mutable
- Scala 不可变集合,就是指该集合对象不可修改,每次修改就会返回一个新对象,而不会对原对象进行修改。类似于 java 中的 String 对象
- Scala 可变集合,就是这个集合可以直接对原对象进行修改,而不会返回新的对象。类于 java 中 StringBuilder 对象。
- 建议:在操作集合的时候,不可变用符号,可变用方法
- 不可变集合继承图
- Set、Map 是 Java 中也有的集合
- Seq 是 Java 没有的,我们发现 List 归属到 Seq 了,因此这里的 List 就和 Java 不是同一个概念了
- 我们前面的 for 循环有一个 1 to 3,就是 IndexedSeq 下的 Range
- String 也是属于 IndexedSeq, 虚线表示隐式转换
- 我们发现经典的数据结构比如 Queue 和 Stack 被归属到 LinearSeq(线性序列)
- 大家注意 Scala 中的 Map 体系有一个 SortedMap,说明 Scala 的 Map 可以支持排序
- IndexedSeq 和 LinearSeq 的区别:
- IndexedSeq 是通过索引来查找和定位,因此速度快,比如 String 就是一个索引集合,通过索引即可定位
- LinearSeq 是线型的,即有头尾的概念,这种数据结构一般是通过遍历来查找

- 可变集合继承图

第二节 数组
2.1 不可变数组
- 第一种方式定义数组
- new 是关键字
- [Int]是指定可以存放的数据类型,如果希望存放任意数据类型,则指定 Any
- (10),表示数组的大小,确定后就不可以变化
- 第二种方式定义数组
- 在定义数组时,直接赋初始值
- 使用 apply 方法创建数组对象
val arr1 = new Array[Int](10)
val arr1 = Array(1, 2)
- 案例实操
package chapter07
object Test01_ImmutableArray {
def main(args: Array[String]): Unit = {
val arr: Array[Int] = new Array[Int](5)
val arr2 = Array(12, 37, 42, 58, 97)
println(arr)
println(arr(0))
println(arr(1))
println(arr(4))
arr(0) = 12
arr(4) = 57
println(arr(0))
println(arr(1))
println(arr(4))
println("========================")
for (i <- 0 until arr.length){
println(arr(i))
}
for (i <- arr.indices) println(arr(i))
println("---------------------")
for (elem <- arr2) println(elem)
println("---------------------")
val iter = arr2.iterator
while (iter.hasNext)
println(iter.next())
println("---------------------")
arr2.foreach( (elem: Int) => println(elem) )
arr.foreach( println )
println(arr2.mkString("--"))
println("========================")
val newArr = arr2.:+(73)
println(arr2.mkString("--"))
println(newArr.mkString("--"))
val newArr2 = newArr.+:(30)
println(newArr2.mkString("--"))
val newArr3 = newArr2 :+ 15
val newArr4 = 19 +: 29 +: newArr3 :+ 26 :+ 73
println(newArr4.mkString(", "))
}
}
2.2 可变数组
- 定义变长数组
- [Any]存放任意数据类型
- (3, 2, 5)初始化好的三个元素
- ArrayBuffer 需要引入
scala.collection.mutable.ArrayBuffer
val arr01 = ArrayBuffer[Any](3, 2, 5)
- 案例实操
- ArrayBuffer 是有序的集合
- 增加元素使用的是 append 方法(),支持可变参数
- 不可变数组与可变数组的转换
- arr1.toBuffer //不可变数组转可变数组
- arr2.toArray //可变数组转不可变数组
- arr2.toArray 返回结果才是一个不可变数组,arr2 本身没有变化
- arr1.toBuffer 返回结果才是一个可变数组,arr1 本身没有变化
package chapter07
import scala.collection.mutable
import scala.collection.mutable.ArrayBuffer
object Test02_ArrayBuffer {
def main(args: Array[String]): Unit = {
val arr1: ArrayBuffer[Int] = new ArrayBuffer[Int]()
val arr2 = ArrayBuffer(23, 57, 92)
println(arr1)
println(arr2)
println(arr2(1))
arr2(1) = 39
println(arr2(1))
println("======================")
val newArr1 = arr1 :+ 15
println(arr1)
println(newArr1)
println(arr1 == newArr1)
val newArr2 = arr1 += 19
println(arr1)
println(newArr2)
println(arr1 == newArr2)
newArr2 += 13
println(arr1)
77 +=: arr1
println(arr1)
println(newArr2)
arr1.append(36)
arr1.prepend(11, 76)
arr1.insert(1, 13, 59)
println(arr1)
arr1.insertAll(2, newArr1)
arr1.prependAll(newArr2)
println(arr1)
arr1.remove(3)
println(arr1)
arr1.remove(0, 10)
println(arr1)
arr1 -= 13
println(arr1)
val arr: ArrayBuffer[Int] = ArrayBuffer(23, 56, 98)
val newArr: Array[Int] = arr.toArray
println(newArr.mkString(", "))
println(arr)
val buffer: mutable.Buffer[Int] = newArr.toBuffer
println(buffer)
println(newArr)
}
}
2.3 多维数组
- 多维数组定义
val arr = Array.ofDim[Double](3,4)
- 案例实操
package chapter07
object Test03_MulArray {
def main(args: Array[String]): Unit = {
val array: Array[Array[Int]] = Array.ofDim[Int](2, 3)
array(0)(2) = 19
array(1)(0) = 25
println(array.mkString(", "))
for (i <- 0 until array.length; j <- 0 until array(i).length){
println(array(i)(j))
}
for (i <- array.indices; j <- array(i).indices){
print(array(i)(j) + "\t")
if (j == array(i).length - 1) println()
}
array.foreach(line => line.foreach(println))
array.foreach(_.foreach(println))
}
}
第三节 列表List
3.1 不可变 List
- List 默认为不可变集合
- 创建一个 List(数据有顺序,可重复)
- 遍历 List
- List 增加数据
- 集合间合并:将一个整体拆成一个一个的个体,称为扁平化
- 取指定数据
- 空集合 Nil
package chapter07
object Test04_List {
def main(args: Array[String]): Unit = {
val list1 = List(23, 65, 87)
println(list1)
println(list1(1))
list1.foreach(println)
val list2 = 10 +: list1
val list3 = list1 :+ 23
println(list1)
println(list2)
println(list3)
println("==================")
val list4 = list2.::(51)
println(list4)
val list5 = Nil.::(13)
println(list5)
val list6 = 73 :: 32 :: Nil
val list7 = 17 :: 28 :: 59 :: 16 :: Nil
println(list7)
val list8 = list6 :: list7
println(list8)
val list9 = list6 ::: list7
println(list9)
val list10 = list6 ++ list7
println(list10)
}
}
3.2 可变 ListBuffer
- 创建一个可变集合 ListBuffer
- 向集合中添加数据
- 打印集合数据
package chapter07
import scala.collection.mutable.ListBuffer
object Test05_ListBuffer {
def main(args: Array[String]): Unit = {
val list1: ListBuffer[Int] = new ListBuffer[Int]()
val list2 = ListBuffer(12, 53, 75)
println(list1)
println(list2)
println("==============")
list1.append(15, 62)
list2.prepend(20)
list1.insert(1, 19, 22)
println(list1)
println(list2)
println("==============")
31 +=: 96 +=: list1 += 25 += 11
println(list1)
println("==============")
val list3 = list1 ++ list2
println(list1)
println(list2)
println("==============")
list1 ++=: list2
println(list1)
println(list2)
println("==============")
list2(3) = 30
list2.update(0, 89)
println(list2)
list2.remove(2)
list2 -= 25
println(list2)
}
}
第四节 Set 集合
4.1 不可变 Set
- 默认情况下 ,Scala使用的是不可变集合 ,如果你想使用可变集合,需要引用
scala.collection.mutable.Set
包 - Set 默认是不可变集合,数据无序
- 数据不可重复
- 遍历集合
package chapter07
object Test06_ImmutableSet {
def main(args: Array[String]): Unit = {
val set1 = Set(13, 23, 53, 12, 13, 23, 78)
println(set1)
println("==================")
val set2 = set1 + 129
println(set1)
println(set2)
println("==================")
val set3 = Set(19, 13, 23, 53, 67, 99)
val set4 = set2 ++ set3
println(set2)
println(set3)
println(set4)
val set5 = set3 - 13
println(set3)
println(set5)
}
}
4.2 可变 mutable.Set
- 创建可变集合 mutable.Set
- 打印集合
- 集合添加元素
- 向集合中添加元素,返回一个新的 Set
- 删除数据
package chapter07
import scala.collection.mutable
object Test07_MutableSet {
def main(args: Array[String]): Unit = {
val set1: mutable.Set[Int] = mutable.Set(13, 23, 53, 12, 13, 23, 78)
println(set1)
println("==================")
val set2 = set1 + 11
println(set1)
println(set2)
set1 += 11
println(set1)
val flag1 = set1.add(10)
println(flag1)
println(set1)
val flag2 = set1.add(10)
println(flag2)
println(set1)
println("==================")
set1 -= 11
println(set1)
val flag3 = set1.remove(10)
println(flag3)
println(set1)
val flag4 = set1.remove(10)
println(flag4)
println(set1)
println("==================")
}
}
第五节 Map 集合
5.1 不可变 Map
- Scala 中的 Map 和 Java 类似,也是一个散列表,它存储的内容也是键值对(key-value)映射
- 创建不可变集合 Map
- 循环打印
- 访问数据
- 如果 key 不存在,返回 0
package chapter07
object Test08_ImmutableMap {
def main(args: Array[String]): Unit = {
val map1: Map[String, Int] = Map("a" -> 13, "b" -> 25, "hello" -> 3)
println(map1)
println(map1.getClass)
println("==========================")
map1.foreach(println)
map1.foreach( (kv: (String, Int)) => println(kv) )
println("============================")
for (key <- map1.keys){
println(s"$key ---> ${map1.get(key)}")
}
println("a: " + map1.get("a").get)
println("c: " + map1.get("c"))
println("c: " + map1.getOrElse("c", 0))
println(map1("a"))
}
}
5.2 可变 Map
- 创建可变集合
- 打印集合
- 向集合增加数据
- 删除数据
- 修改数据
package chapter07
import scala.collection.mutable
object Test09_MutableMap {
def main(args: Array[String]): Unit = {
val map1: mutable.Map[String, Int] = mutable.Map("a" -> 13, "b" -> 25, "hello" -> 3)
println(map1)
println(map1.getClass)
println("==========================")
map1.put("c", 5)
map1.put("d", 9)
println(map1)
map1 += (("e", 7))
println(map1)
println("====================")
println(map1("c"))
map1.remove("c")
println(map1.getOrElse("c", 0))
map1 -= "d"
println(map1)
println("====================")
map1.update("c", 5)
map1.update("e", 10)
println(map1)
println("====================")
val map2: Map[String, Int] = Map("aaa" -> 11, "b" -> 29, "hello" -> 5)
println(map1)
println(map2)
println("---------------------------")
val map3: Map[String, Int] = map2 ++ map1
println(map1)
println(map2)
println(map3)
}
}
第六节 元组
- 元组也是可以理解为一个容器,可以存放各种相同或不同类型的数据。说的简单点,就是将多个无关的数据封装为一个整体,称为元组。
- 注意:元组中最大只能有 22 个元素。
- 案例实操
- 声明元组的方式:(元素 1,元素 2,元素 3)
- 访问元组
- Map 中的键值对其实就是元组,只不过元组的元素个数为 2,称之为对偶
package chapter07
object Test10_Tuple {
def main(args: Array[String]): Unit = {
val tuple: (String, Int, Char, Boolean) = ("hello", 100, 'a', true)
println(tuple)
println(tuple._1)
println(tuple._2)
println(tuple._3)
println(tuple._4)
println(tuple.productElement(1))
println("====================")
for (elem <- tuple.productIterator)
println(elem)
val mulTuple = (12, 0.3, "hello", (23, "scala"), 29)
println(mulTuple._4._2)
}
}