Scala快速學習教程(二)
上一篇文章寫到了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方法實際上返回的是一個迭代器,可以用迴圈的方法遍歷輸出。