上一篇文章写到了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方法实际上返回的是一个迭代器,可以用循环的方法遍历输出。