学科分类
目录
Spark技术栈

集合

在Scala中,集合有三大类: List、Set以及Map,所有的集合都扩展自Iterable特质。Scala 集合分为可变的(mutable)和不可变(immutable)的集合。其中,可变集合可以在适当的地方被更新或扩展。这意味着,可以对集合进行修改、添加、移除元素;不可变集合类,相比之下,初始化后就永远不会改变。不过,我们可以通过模拟添加、移除或更新操作,但这些操作将在每一种情况下都返回一个新的集合,同时保持原来的集合不变。

  1. 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所示。

img

​ 图1 操作List列表的打印输出

  1. 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所示。

img

​ 图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所示。

img

​ 图3 操作Map集合的打印输出

点击此处
隐藏目录