集合
在Scala中,集合有三大类: List、Set以及Map,所有的集合都扩展自Iterable特质。Scala 集合分为可变的(mutable)和不可变(immutable)的集合。其中,可变集合可以在适当的地方被更新或扩展。这意味着,可以对集合进行修改、添加、移除元素;不可变集合类,相比之下,初始化后就永远不会改变。不过,我们可以通过模拟添加、移除或更新操作,但这些操作将在每一种情况下都返回一个新的集合,同时保持原来的集合不变。
- List
在Scala中,List列表和数组类似,列表的所有元素都具有相同类型。然而,列表与数组不同的是,列表是不可变的(即列表的元素不能通过赋值来更改)。
定义不同类型列表List,具体代码如下:
// 字符串
val fruit: List[String] = List("apples", "oranges", "pears")
// 整型
val nums: List[Int] = List(1, 2, 3, 4)
// 空
val empty: List[Nothing] = List()
// 二维列表
val dim: List[List[Int]] =
List(
List(1, 0, 0),
List(0, 1, 0),
List(0, 0, 1)
)
上述定义列表的代码中,我们定义了字符串列表、整型列表、空列表以及二维列表。在Scala中,可以使用“Nil”和“::”操作符来定义列表。其中,“Nil”表示空列表;“::”意为构造,向列表的头部追加数据,创造新列表。使用“Nil”和“::”操作符定义列表的代码如下:
// 字符串
val fruit = "apples":: ("oranges"::("pears"::Nil))
// 整型
val nums = 1::(2::(3::(4::Nil)))
// 空列表
val empty = Nil
// 二维列表
val dim = (1::(0::(0::Nil))) ::
(0::(1::(0::Nil))) ::
(0::(0::(1::Nil)))::Nil
在Scala中,列表List作为数据结构之一,Scala也提供了很多操作List的方法。接下来,我们列举一些操作List常见的方法,如表1所示。
表1 Scala中操作List的常见方法
方法名称 | 相关说明 |
---|---|
head | 获取列表第一个元素 |
tail | 返回除第一个之外的所有元素组成的列表 |
isEmpty | 若列表为空,则返回true,否则返回false |
take | 获取列表前n个元素 |
contains | 判断是否包含指定元素 |
在表1-1中,列举了操作List列表的常见方法,如果读者想要学习更多操作List的方法,请参考https://www.scala-lang.org/api/current/scala/collection/immutable/List.html
进行学习。下面,我们通过简单的例子演示操作List列表。例如,定义一个fruit列表,使用常见的方法对列表fruit进行相关的操作,具体代码如文件1所示。
文件1 ListTest.scala
1 object ListTest{
2 def main(args: Array[String]) {
3 val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
4 val nums = Nil
5 println("Head of fruit : " + fruit.head)
6 println("Tail of fruit : " + fruit.tail)
7 println("Check if fruit is empty : " + fruit.isEmpty)
8 println("Check if nums is empty : " + nums.isEmpty)
9 println("Tail of fruit : " + fruit.take(2))
10 println("Contains of fruit : " + fruit.contains("apples"))
11 }
12 }
上述代码中,第3-10行代码定义了一个字符串列表fruit并进行相关操作,即获取该列表中的指定元素、判断列表是否为空以及判断列表是否包含指定元素等相关操作。
运行上述文件1中的代码,效果如图1所示。
图1 操作List列表的打印输出
- Set
在Scala中,Set是没有重复对象的集合,所有元素都是唯一的。默认情况下,Scala 使用不可变Set集合,若想使用可变的Set集合,则需要引入 scala.collection.mutable.Set 包。
定义Set集合的语法格式如下:
val set: Set[Int] = Set(1,2,3,4,5)
Scala提供了很多操作Set集合的方法。接下来,我们列举一些操作Set集合的常见方法,如表2所示。
表2 Scala中操作Set集合的常见方法
方法名称 | 相关说明 |
---|---|
head | 获取Set集合的第一个元素 |
tail | 返回除第一个之外的所有元素组成的Set集合 |
isEmpty | 若Set集合为空,则返回true,否则返回false |
take | 获取Set集合前n个元素 |
contains | 判断Set集合是否包含指定元素 |
在表1-2中,列举了操作Set集合的常见方法,如果读者想要学习更多操作Set集合的方法,请参考https://www.scala-lang.org/api/current/scala/collection/Set.html
进行学习。
接下来,定义一个Set集合site,使用常见的方法对集合site进行相关的操作,具体代码如文件2所示。
文件2 SetTest.scala
1 object SetTest {
2 def main(args: Array[String]) {
3 val site = Set("Itcast", "Google", "Baidu")
4 val nums: Set[Int] = Set()
5 println( "第一网站是 : " + site.head )
6 println( "最后一个网站是 : " + site.tail )
7 println( "查看集合 site 是否为空 : " + site.isEmpty )
8 println( "查看 nums 是否为空 : " + nums.isEmpty )
9 println("查看site 的前两个网站: " + site.take(2))
10 println("查看集合是否包含网站Itcast : " + site.contains("Itcast"))
11 }
12 }
上述代码中,第2-10行代码是主方法main,并在主方法中定义了两个Set集合site和nums,并对集合site和nums进行相关操作,即获取集合中的指定元素、判断集合是否为空以及判断集合是否包含指定元素等相关操作。
运行上述文件2中的代码,效果如图2所示。
图2 操作Set集合的打印输出
3. Map
在Scala中,Map是一种可迭代的键值对(key/value)结构,并且键是唯一的,值不一定是唯一的,所有的值都是通过键来获取的。Map中所有元素的键与值都存在一种对应关系,这种关系即为映射。Map有两种类型,可变与不可变,区别在于可变对象可修改,而不可变对象不可修改。在 Scala 中,可以同时使用可变与不可变 Map ,默认使用不可变Map。若需要使用可变的Map集合,则需要引入 import scala.collection.mutable.Map 类。
定义Map集合的语法格式如下:
var A:Map[Char,Int] = Map(键 -> 值,键 -> 值...) //Map键值对,键为Char,值为Int
Scala也提供了很多操作Map集合的方法。接下来,我们列举一些操作Map集合的常见方法,如表3所示。
表3 Scala中操作Map集合的常见方法
方法名称 | 相关说明 |
---|---|
() | 根据某个键查找对应的值,类似于Java中的get() |
contains() | 检查Map中是否包含某个指定的键 |
getOrElse() | 判断是否包含键,若包含返回对应的值,否则返回其他的 |
keys | 返回Map所有的键(key) |
values | 返回Map所有的值(value) |
isEmpty | 若Map为空时,返回true |
在表1-3中,列举了常见的操作Map集合的方法,如果读想要学习更多操作Map集合的方法,请参考https://www.scala-lang.org/api/current/scala/collection/immutable/Map.html
进行学习。
接下来,定义一个Map集合colors,使用Map常见的方法对集合colors进行相关的操作,具体代码如文件3所示。
文件3 MapTest.scala
1 object MapTest{
2 def main(args: Array[String]) {
3 val colors = Map("red" -> "#FF0000",
4 "azure" -> "#F0FFFF",
5 "peru" -> "#CD853F")
6 val peruColors=if(colors.contains("peru")) colors("peru") else 0
7 val azureColor = colors.getOrElse("azure",0)
8 println("获取colors中键为red的值:"+colors("red"))
9 println("获取colors 中所有的键 : " + colors.keys)
10 println("获取colors 中所有的值 : " + colors.values)
11 println("检测 colors 是否为空 : " + colors.isEmpty)
12 println("判断colors是否包含键peru包含则返回对应值,否则返回0:"+peruColors)
13 println("判断colors是否包含键azure,包含则获取对应值,否则返回0:"+azureColor)
14 }
15 }
上述代码中,第2-13行代码是主方法main,并在主方法中定义了一个Map集合colors,并对集合colors进行相关操作,即获取该集合中的指定键的值、判断集合是否为空以及判断集合是否包含指定键等相关操作。
运行上述文件3中的代码,效果如图3所示。
图3 操作Map集合的打印输出