四天掌握Scala(4)
1.13.1 不可变列表定义
不可变列表就是列表的 元素、长度 都是不可变的。
语法: 使用 List(元素1, 元素2, 元素3, ...)
来创建一个不可变列表,语法格式:
val/var 变量名 = List(元素1, 元素2, 元素3...)
使用 Nil
创建一个不可变的空列表:
val/var 变量名 = Nil
使用 ::
方法创建一个不可变列表:
val/var 变量名 = 元素1 :: 元素2 :: Nil
使用 :: 拼接方式来创建列表,必须在最后添加一个 Nil。 示例代码如下:
//创建一个不可变列表,存放以下几个元素(1,2,3,4) scala> val a = List(1,2,3,4) a: List[Int] = List(1, 2, 3, 4) //使用Nil创建一个不可变的空列表 scala> val b = Nil b: scala.collection.immutable.Nil.type = List() //使用`::`方法创建列表,包含-2、-1两个元素 //注意: `::` 前后的空格不能省略,会报错。 scala> val c = -2 :: -1 :: Nil c: List[Int] = List(-2, -1)
1.13.2 可变列表
可变列表就是列表的元素、长度都是可变的。要使用可变列表,先要导入import scala.collection.mutable.ListBuffer
,可变集合都在 mutable
包中,不可变集合都在 immutable
包中(默认导入)。使用 ListBuffer[元素类型]() 创建空的可变列表,语法结构:
val/var 变量名 = ListBuffer[Int]()
使用 ListBuffer(元素1, 元素2, 元素3…) 创建可变列表,语法结构:
val/var 变量名 = ListBuffer(元素1,元素2,元素3...)
示例代码如下:
//创建空的整型可变列表 scala> import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer scala> val a = ListBuffer[Int]() a: scala.collection.mutable.ListBuffer[Int] = ListBuffer() //创建一个可变列表,包含以下元素:1,2,3,4 scala> val a1 = ListBuffer(1,2,3,4) a1: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4)
可变列表操作如下:
- 获取元素(使用括号访问
(索引值)
) - 添加元素(
+=
) - 追加一个列表(
++=
) - 更改元素(
使用括号获取元素,然后进行赋值
) - 删除元素(
-=
) - 转换为List(
toList
)转换为不可变列表 - 转换为Array(
toArray
)转换为定长数组
//示例 //1.定义一个可变列表包含以下元素:1,2,3 scala> import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer scala> val a = ListBuffer(1,2,3) a: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3) //2.获取第一个元素 scala> a(0) res34: Int = 1 //3.添加一个新的元素:4 scala> a += 4 res35: a.type = ListBuffer(1, 2, 3, 4) //4.追加一个列表,该列表包含以下元素:5,6,7 scala> a ++= ListBuffer(5,6,7) res36: a.type = ListBuffer(1, 2, 3, 4, 5, 6, 7) //5.删除元素7 scala> a -= 7 res37: a.type = ListBuffer(1, 2, 3, 4, 5, 6) //6.将可变列表转换为不可变列表 scala> a.toList res38: List[Int] = List(1, 2, 3, 4, 5, 6) //7.将可变列表转换为数组 scala> a.toArray res39: Array[Int] = Array(1, 2, 3, 4, 5, 6)
1.13.3 列表常用操作
以下是列表常用的操作:
- 判断列表是否为空(
isEmpty
) - 拼接两个列表(
++
) - 获取列表的首个元素(
head
)和剩余部分(tail
) - 反转列表(
reverse
) - 获取前缀(
take
)、获取后缀(drop
) - 扁平化(
flaten
)。扁平化表示将列表中的列表中的所有元素放到一个列表中。 - 拉链(
zip
)和拉开(unzip
)。拉链:使用 zip 将两个列表,组合成一个元素为元组的列表。拉开:将一个包含元组的列表,解开成包含两个列表的元组。 - 转换字符串(
toString
)
scala> val a = List(1,2,3,4) a: List[Int] = List(1, 2, 3, 4) scala> a.toString res52: String = List(1, 2, 3, 4)
- 生成字符串(
mkString
)
scala> val a = List(1,2,3,4) a: List[Int] = List(1, 2, 3, 4) scala> a.mkString res53: String = 1234 scala> a.mkString(":") res54: String = 1:2:3:4
- 并集(
union
)交集(intersect
) 差集(diff
)
scala> val a1 = List(1,2,3,4) a1: List[Int] = List(1, 2, 3, 4) scala> val a2 = List(3,4,5,6) a2: List[Int] = List(3, 4, 5, 6) scala> a1.union(a2) res55: List[Int] = List(1, 2, 3, 4, 3, 4, 5, 6) scala> a1.union(a2).distinct res56: List[Int] = List(1, 2, 3, 4, 5, 6) scala> a1.intersect(a2) res57: List[Int] = List(3, 4) scala> a1.diff(a2) res58: List[Int] = List(1, 2)
1.14 Set
Set(集) 是代表没有重复元素的集合。Set 具备以下性质:
- 元素不重复。
- 不保证插入顺序。
和 List 正好相反,List:
- 元素可以重复。
- 保证插入顺序。
Scala 中的集也分为两种,一种是不可变集,另一种是可变集。
1.14.1 不可变集
语法格式如下: 创建一个空的不可变集,语法格式:
val/var 变量名 = Set[类型]()
给定元素来创建一个不可变集,语法格式:
val/var 变量名 = Set(元素1, 元素2, 元素3...)
示例代码如下:
scala> val a = Set[Int]() a: scala.collection.immutable.Set[Int] = Set() scala> val a = Set(1,1,3,2,5,9) a: scala.collection.immutable.Set[Int] = Set(5, 1, 9, 2, 3)
基本操作
- 获取集的大小(
size
) - 遍历集(
和遍历数组一致
) - 添加一个元素,生成一个Set(
+
) - 拼接两个集,生成一个Set(
++
) - 拼接集和列表,生成一个Set(
++
)
示例代码如下:
scala> val a = Set[Int]() a: scala.collection.immutable.Set[Int] = Set() scala> val a = Set(1,1,3,2,5,9) a: scala.collection.immutable.Set[Int] = Set(5, 1, 9, 2, 3) scala> val s = Set(1,1,2,3,4,5) s: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4) scala> s.size res59: Int = 5 scala> for(i <- s) print(i) 51234 scala> s - 1 res62: scala.collection.immutable.Set[Int] = Set(5, 2, 3, 4) scala> s ++ Set(6,7,8) res63: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 8, 4) scala> s ++ List(6,7,8,9) res64: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 9, 2, 7, 3, 8, 4)
1.14.2 可变集
可变集合不可变集的创建方式一致,只不过需要提前导入一个可变集类。手动导入:import scala.collection.mutable.Set
。示例代码如下:
scala> import scala.collection.mutable.Set import scala.collection.mutable.Set scala> val a = Set(1,2,3,4) a: scala.collection.mutable.Set[Int] = Set(1, 2, 3, 4) scala> a += 5 res65: a.type = Set(1, 5, 2, 3, 4) scala> a -= 1 res66: a.type = Set(5, 2, 3, 4)
1.15 Map 对象
Map 可以称之为映射。它是由键值对组成的集合。在 Scala 中,Map 也分为不可变 Map 和可变 Map。
1.15.1 不可变 Map
语法格式如下:
val/var map = Map(键->值, 键->值, 键->值...) // 推荐,可读性更好 val/var map = Map((键, 值), (键, 值), (键, 值), (键, 值)...)
示例代码如下:
scala> val map = Map("zhangsan"->30, "lisi"->40) map: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 30, lisi -> 40) scala> val map = Map(("zhangsan", 30), ("lisi", 30)) map: scala.collection.immutable.Map[String,Int] = Map(zhangsan -> 30, lisi -> 30) scala> map("lisi") res67: Int = 30
1.15.2 可变 Map
定义语法与不可变 Map 一致。但定义可变 Map 需要手动导入 import scala.collection.mutable.Map
。示例代码如下:
scala> import scala.collection.mutable.Map import scala.collection.mutable.Map scala> val map = Map("zhangsan"->30, "lisi"->40) map: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 30) scala> map("zhangsan") = 20
1.15.3 Map 基本操作
基本操作如下:
- 获取值 (
map(key)
)。 - 获取所有 key(
map.keys
)。 - 获取所有 value(
map.values
)。 - 遍历 map 集合。
- getOrElse。
- 增加 key,value 对。
- 删除 key。
示例代码如下:
scala> import scala.collection.mutable.Map import scala.collection.mutable.Map //1. 定义一个映射,包含以下学生姓名和年龄数据 scala> val map = Map("zhangsan"->30, "lisi"->40) map: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 3 //2. 获取zhangsan的年龄 scala> map("zhangsan") res69: Int = 30 //3. 获取所有的学生姓名 scala> map.keys res70: Iterable[String] = Set(lisi, zhangsan) //4. 获取所有的学生年龄 scala> map.values res71: Iterable[Int] = HashMap(40, 30) //5. 打印所有的学生姓名和年龄 scala> for((x,y) <- map) println(s"$x $y") lisi 40 zhangsan 30 //6. 获取wangwu的年龄,如果wangwu不存在,则返回-1 scala> map.getOrElse("wangwu", -1) res73: Int = -1 //7. 新增一个学生:wangwu, 35 scala> map + ("wangwu"->35) res74: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 30, wangwu -> 35) //scala> map + ("ppp" ->10, "iii" -> 9) scala> map + (("ppp", 10), ("iii", 9)) res75: scala.collection.mutable.Map[String,Int] = Map(lisi -> 40, zhangsan -> 30, ppp -> 10, iii -> 9) //8. 将lisi从可变映射中移除 scala> map - "lisi" res77: scala.collection.mutable.Map[String,Int] = Map(zhangsan -> 30)
1.16 iterator 迭代器
Scala 针对每一类集合都提供了一个迭代器 (iterator) 用来迭代访问集合。
1.16.1 使用迭代器遍历集合
- 使用
iterator
方法可以从集合获取一个迭代器。 - 迭代器的两个基本操作。
- hasNext——查询容器中是否有下一个元素
- next——返回迭代器的下一个元素,如果没有,抛出 NoSuchElementException,每一个迭代器都是有状态的(只能用一次,内部指针只走一次,走到最后就结束了,不会再回到开头,除非你再取得一个新的迭代器)。
- 迭代完后保留在最后一个元素的位置。
- 再次使用则抛出 NoSuchElementException。
- 可以使用 while 或者 for 来逐个返回元素。
示例代码如下:
scala> val a = List(1,2,3,4,5) a: List[Int] = List(1, 2, 3, 4, 5) scala> val ite = a.iterator ite: Iterator[Int] = <iterator> scala> while(ite.hasNext){ | println(ite.next) | } 1 2 3 4 5
使用 for 表达式和迭代器,遍历打印该列表,示例代码如下:
scala> val a = List(1,2,3,4,5) a: List[Int] = List(1, 2, 3, 4, 5) scala> for(i <- a) println(i) 1 2 3 4 5