Scala快速学习教程(二)

本文是Scala快速学习教程的第二部分,重点介绍了Scala中的数据结构,包括定长数组(Array)与变长数组(ArrayBuffer)、列表(List)、元组(Tuple)、集(Set)和映射(Map)。文中详细阐述了各数据结构的声明、操作以及遍历方法,并提供了示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    上一篇文章写到了Scala基础知识及控制结构,这篇文章来介绍一下Scala中的数据结构。


定长数组(Array)与变长数组(ArrayBuffer)

定长数组声明有两种形式:

  • 声明指定长度的数组 val 数组名= new Array[类型](数组长度)
val intValueArr = new Array[Int](3)  //声明一个长度为3的整型数组,每个数组元素初始化为0
intValueArr(0) = 12 //给第1个数组元素赋值为12
intValueArr(1) = 45  //给第2个数组元素赋值为45
intValueArr(2) = 33 //给第3个数组元素赋值为33

注意:在Scala中对数组元素的应用使用圆括号intValueArr(0).

  • 提供数组初始值的数组,无需new关键字
val intValueArr = Array(12,45,33)

变长数组声明:val 数组名 = ArrayBuffer[类型]()

通过+=操作符添加元素序列,++=操作符来拼接数组Array,toArray方法转换为数组Array

val b = ArrayBuffer[Int]()
b += 1
b += (2,3)
b ++= Array(4,5,6)
//b为 ArrayBuffer(1,2,3,4,5,6)
b.toArray
//转换为Array(1,2,3,4,5,6)

通过for循环遍历数组可以采用按下标遍历的形式,但推荐如下方式更加简洁

for(i <- b) println(i)

另外数组包含一些操作,如sum,max,min,sorted等


列表(List)

Scala 列表类似于数组,它们所有元素的类型都相同,但是它们也有所不同:列表是不可变的,值一旦被定义了就不能改变

提供初始值声明列表

val intList = List(1,2,3)

列表有头部和尾部的概念,可以使用intList.head来获取上面定义的列表的头部,值是1,使用intList.tail来获取上面定义的列表的尾部,值是List(2,3),可以看出,头部是一个元素,而尾部则仍然是一个列表。

构造列表的两个基本单位是Nil和::,Nil也可以表示为一个空列表

val intListOther = 0::intList //在列表头部添加单一元素
val intList = 1::2::3::Nil //构建列表的另一种方式

添加单一元素时我们使用两个引号的操作符::,在连接两个列表时使用三个引号:::

val intList1 = List(1,2)
val intList2 = List(3,4)
val intList3 = intList1:::intList2

元组(tuple)

元组是不同类型的值的聚集。元组和列表不同,列表中各个元素必须是相同类型,而元组可以包含不同类型的元素。通过将不同类型的值用小括号括起来表示元组。

val tuple = ("BigData",2015,45.0)
println(tuple._1)

通过_1,_2,_3的形式访问对应下标组元(注意:元组中组元下标从1开始)

元组可用于函数返回多个不同类型值的情形,函数之后讲解


集(Set)

集(set)是不重复元素的集合。列表中的元素是按照插入的先后顺序来组织的,但是,”集”中的元素并不会记录元素的插入顺序,而是以“哈希”方法对元素的值进行组织,所以,它允许你快速地找到某个元素。

集包括可变集和不可变集,缺省情况下创建的是不可变集。

scala> var mySet = Set("Hadoop","Spark")
mySet: scala.collection.immutable.Set[String] = Set(Hadoop, Spark)
scala> mySet += "Scala"  //向mySet中增加新的元素
scala> println(mySet.contains("Scala"))
true

在不可变集中添加新元素,该不可变集必须声明为var。

如果要声明一个可变集,则需要引入scala.collection.mutable.Set包。

scala> import scala.collection.mutable.Set
import scala.collection.mutable.Set

scala> val myMutableSet = Set("Database","BigData")
myMutableSet: scala.collection.mutable.Set[String] = Set(BigData, Database)

scala> myMutableSet += "Cloud Computing"
res0: myMutableSet.type = Set(BigData, Cloud Computing, Database)

可变集声明为val变量仍进行添加元素操作。


映射(Map)

在Scala中,映射(Map)是一系列键值对的集合,也就是,建立了键和值之间的对应关系。在映射中,所有的值,都可以通过键来获取。

映射包括可变和不可变两种,默认情况下创建的是不可变映射,如果需要创建可变映射,需要引入scala.collection.mutable.Map包。不可变映射无法更新映射中元素,也无法增加新的元素。

映射声明:

val university = Map("XMU" -> "Xiamen University", "THU" -> "Tsinghua University","PKU"->"Peking University")

映射遍历:for((k,v) <- 映射)  语句块

for ((k,v) <- university) printf("Code is : %s and name is: %s\n",k,v)

映射常用操作

  • 通过键来获取映射中的值:映射(键值)
println(university("XMU"))
  • 判断映射中是否含有某个键: map.contains(键值)
university.contains("XMU")
  • 使用+=向可变映射中添加元素或拼接映射,使用-=移除可变映射中的键及对应元素,或使用=直接更新值或添加新元素
import scala.collection.mutable.Map
val university2 = Map("XMU" -> "Xiamen University", "THU" -> "Tsinghua University","PKU"->"Peking University")
university2("XMU") = "Ximan University" //更新已有元素的值
university2("FZU") = "Fuzhou University" //添加新元素
university2 + = ("TJU"->"Tianjin University") //添加一个新元素
university2 -= "TJU"

     添加新映射时要注意类型相同,如本例中只能添加"String" -> "String" 的映射

  • 不可变映射通过+操作符返回一个新的不可变映射;不可变映射通过-操作符返回一个新的不可变映射
  • 使用keys/values方法获得映射键值和映射值

迭代器(Iterator)

在Scala中,迭代器(Iterator)提供了访问集合的一种方法。包含两个基本操作:next和hasNext。next可以返回迭代器的下一个元素,hasNext用于检测是否还有下一个元素。

给出while循环或for循环对迭代器遍历的两个例子

val iter = Iterator("Hadoop","Spark","Scala")
while (iter.hasNext) {
    println(iter.next())
}

for循环

val iter = Iterator("Hadoop","Spark","Scala")
for (elem <- iter) {
    println(elem)
}

注意到上文中提到的map的keys和values方法实际上返回的是一个迭代器,可以用循环的方法遍历输出。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值