1. 程式人生 > >Scala快速學習教程(二)

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方法實際上返回的是一個迭代器,可以用迴圈的方法遍歷輸出。