Array
//聲明變量arr為Array整數類型的數組,包含5個元素。
scala>?val?arr=?new?Array[Int](5)
arr:?Array[Int]?=?Array(0,?0,?0,?0,?0)
//訪問第三個元素
scala>?arr(2)
res15:?Int?=?0
//修改第三個元素
scala>?arr(2)=8
//再次查看arr數組,發現第三個元素值已經變成8了。
scala>?arr
res17:?Array[Int]?=?Array(0,?0,8,0,?0)
補充說明,剛才聲明arr數組變量時,所以把它聲明為val不可變變量,這只是表明arr的地址不可以變,但是數組里面的元素還是可以變化的。
//在Spark中,更常見地創建數組是直接通過類名
scala>?val?arr1?=?Array("Scala",?"Spark")
arr1:?Array[String]?=?Array(Scala,?Spark)
該示例中,聲明arr1為數組變量時,沒有使用new關鍵字,也沒有指定String類型,系統默認根據元素值,自動推導出元素的類型為String。
沒有使用new關鍵字,其實它內部調用了apply方法,apply是工廠類構造器。等同于下面的寫法:
scala>?val?arr1?=?Array.apply("Scala",?"Spark")
arr1:?Array[String]?=?Array(Scala,?Spark)
//給Array增加元素。下面寫法會出錯,給arr1數組增加一個元素,比如:
scala>?arr1(2)="Hadoop"
java.lang.ArrayIndexOutOfBoundsException:?2
at?.(:16)
at?.()
……
如果需要給Array增加元素,那么此時就應該使用ArrayBuffer類型。
ArrayBuffer
//首先導入庫
scala>?import?scala.collection.mutable.ArrayBuffer
import?scala.collection.mutable.ArrayBuffer
//定義一個ArrayBuffer類型的變量arrbuffer
scala>?val?arrbuffer=ArrayBuffer[Int]()
arrbuffer:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer()
//向arrbuffer中增加一個元素,值為10
scala>?arrbuffer?+=?10
res23:?arrbuffer.type?=?ArrayBuffer(10)
//向arrbuffer中增加多個元素
scala>?arrbuffer?+=?(11,1,3,5)
res25:?arrbuffer.type?=?ArrayBuffer(10,?11,?1,?3,?5)
//查看arrbuffer的內容
scala>?arrbuffer
res26:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,?1,?3,?5)
//向arrbuffer中增加一個數組
scala>?arrbuffer?++=?Array(1,2,3,4)
res27:?arrbuffer.type?=?ArrayBuffer(10,?11,?1,?3,?5,?1,?2,?3,?4)
//截掉arrbuffer后面的3個元素
scala>?arrbuffer.trimEnd(3)
//再次查看arrbuffer的內容,發現元素:2,?3,?4被截掉
scala>?arrbuffer
res29:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,?1,?3,?5,?1)
//在第5個位置,插入元素值100
scala>?arrbuffer.insert(5,100)
//查看arrbuffer的內容
scala>?arrbuffer
res32:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,?1,?3,?5,100,?1)
//在第2個位置,插入多個元素:200,300,400
scala>?arrbuffer.insert(2,200,300,400)
//查看arrbuffer的內容
scala>?arrbuffer
res34:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,200,?300,?400,1,?3,?5,?100,?1)
//從arrbuffer中移除第3個位置上的元素
scala>?arrbuffer.remove(3)
res35:?Int?=?300//被移除的值是300
//再次查看arrbuffer的內容,發現第3個位置上的元素300不見了。
scala>?arrbuffer
res36:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,?200,?400,?1,?3,?5,?100,?1)
//從arrbuffer中移除第2個位置開始的,3個元素,即:200,?400,?1
scala>?arrbuffer.remove(2,3)
//再次查看arrbuffer的內容,發現三個元素:200,?400,?1不見了。
scala>?arrbuffer
res38:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,?3,?5,?100,?1)
//可變數組變成不可變數組,此時arr2是一個不可變數組
scala>?val?arr2?=??arrbuffer.toArray
arr2:?Array[Int]?=?Array(10,?11,?3,?5,?100,?1)
//Array.toBuffer的結果變成一個ArrayBuffer
scala>?arr2.toBuffer
res40:?scala.collection.mutable.Buffer[Int]?=?ArrayBuffer(10,?11,?3,?5,?100,?1)
//遍歷一個數組:
scala>?for(elem?<-?arr2)?println(elem)
10
11
3
5
100
1
//遍歷數組時加上條件
scala>?arr2
res42:?Array[Int]?=?Array(10,?11,?3,?5,?100,?1)
//遍歷時的條件,跳過偶數位上的元素
scala>?for(i?<-?0?until?(arr2.length,?2))?println(arr2(i))
10
3
100
此時打印出來的結果,跳過了元素:11、5、1
//從尾部開始遍歷
scala>?for(i?<-?(0?until?arr2.length).reverse)?println(arr2(i))
1
100
5
3
11
10
//對數組進行排序
//導入排序包
scala>?import?scala.util.Sorting
import?scala.util.Sorting
//排序之前
scala>?arr2
res42:?Array[Int]?=?Array(10,?11,?3,?5,?100,?1)
//對arr2進行排序
scala>?Sorting.quickSort(arr2)
//排序之后
scala>?arr2
res49:?Array[Int]?=?Array(1,?3,?5,?10,?11,?100)
//顯示arr2中內容
scala>?arr2
res49:?Array[Int]?=?Array(1,?3,?5,?10,?11,?100)
//拼接arr2中的每個元素,用逗號拼接,生成一個字符串
scala>?arr2.mkString(",")
res50:?String?=?1,3,5,10,11,100
//循環arr2里面的每個元素,對其進行自乘運算,并把結果收集起來,產生一個新的數組,賦給arr3
scala>?val?arr3?=?for(i?<-?arr2)?yield?i*i
arr3:?Array[Int]?=?Array(1,?9,?25,?100,?121,?10000)
//?for循環再加上if條件判斷,仍然是循環arr2里面的每個元素,對其進行自乘運算,并把結果收集起來,產生一個新的數組,賦給arr3
scala>?val?arr3?=?for(i?<-?arr2?if?i%3==0)?yield?i*i
arr3:?Array[Int]?=?Array(9)
此時arr3中只有一個元素。
//在scala實際會用它的函數式編程來實現以上代碼
scala>?arr2.filter(_%3?==0).map(i?=>?i*i)
res61:?Array[Int]?=?Array(9)
這種寫法非常優雅簡潔,生成的結果跟上面一樣。map本身是一個函數,里面傳入的參數仍然是一個函數。
//上一行示例中的括號,其實可以改成花括號。
scala>?arr2.filter{_%3?==0}.map{i?=>?i*i}
res62:?Array[Int]?=?Array(9)
//甚至可以省略map前面的點號
scala>?arr2.filter{_%3?==0}map{i?=>?i*i}
res63:?Array[Int]?=?Array(9)
效果跟上一行是一樣的。
Map
//Map里面的元素是Key、Value對,如下所示:
scala>?val?persons?=?Map("Spark"?->?6,?"Hadoop"->11)
persons:?scala.collection.Map[String,Int]?=?Map(Spark?->?6,Hadoop?->?11)
//訪問Key為"Hadoop"的元素,獲得該鍵值對中的Value
scala>?persons?("Hadoop")
res65:?Int?=?11
//申明一個可變Map變量,Key是String,Value是Int類型
scala>?val?pesons?=?scala.collection.mutable.Map("Spark"?->?6,?"Hadoop"->11)
pesons:?scala.collection.mutable.Map[String,Int]?=?Map(Hadoop?->?11,?Spark?->?6)
//對其進行增加元素操作
scala>?persons?+=?("Flink"?->?5)
res67:?persons.type?=?Map(Hadoop?->?11,?Spark?->?6,Flink?->?5)
//對其進行減元素操作
scala>?persons?-=?"Flink"
res68:?persons.type?=?Map(Hadoop?->?11,?Spark?->?6)
//通過條件判斷來獲取map元素的值,判斷該元素是否存在
scala>?val?sparkValue?=?if(persons.contains("Spark"))?persons("Spark")?else?1000
sparkValue:?Int?=?6
//Map自帶getOrElse函數用于獲取某個元素
//首先查看persons的內容
scala>?persons
res70:?scala.collection.mutable.Map[String,Int]?=?Map(Hadoop?->?11,?Spark?->?6)
//訪問時存在Spark元素
scala>?val?sparkValue?=?persons.getOrElse("Spark",1000)
sparkValue:?Int?=?6
//訪問時不在Flink元素
scala>?val?sparkValue?=?persons.getOrElse("Flink",1000)
sparkValue:?Int?=1000
//循環遍歷Map中的元素
scala>?for((key,value)?<-persons)?println("key:"+key+",value:"+value)
key:Hadoop,value:11
key:Spark,value:6
//注意,此時(key,value)其實是一個Tuple
//遍歷Map中的全部的Key
scala>?for(key?<-persons.keySet)?println("key:"+key)
key:Hadoop
key:Spark
//SortedMap
scala>?val?persons?=?scala.collection.immutable.SortedMap("Spark"?->6,?"Hadoop"?->?11)
persons:?scala.collection.immutable.SortedMap[String,Int]?=?Map(Hadoop?->?11,?Spark?->?6)
此時Hadoop元素排在Spark元素的前面
Tuple
一個元組里面有很多不同的類型的元素,接收函數的多個參數時,Tuple特別有用!
//定義了一個Tuple,里面有三個不同類型的元素
scala>?val?tuple?=?("Spark",6,99.01)
tuple:?(String,?Int,?Double)?=?(Spark,6,99.01)
//訪問Tuple變量的第1個元素,注意是順序從1開始!
scala>?tuple._1
res72:?String?=?Spark
//訪問Tuple變量的第2個元素。
scala>?tuple._2
res73:?Int?=?6