Array
//聲明變量arr為Array整數(shù)類型的數(shù)組蚂斤,包含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數(shù)組,發(fā)現(xiàn)第三個元素值已經(jīng)變成8了曙蒸。
scala>?arr
res17:?Array[Int]?=?Array(0,?0,8,0,?0)
補(bǔ)充說明捌治,剛才聲明arr數(shù)組變量時,所以把它聲明為val不可變變量逸爵,這只是表明arr的地址不可以變具滴,但是數(shù)組里面的元素還是可以變化的凹嘲。
//在Spark中师倔,更常見地創(chuàng)建數(shù)組是直接通過類名
scala>?val?arr1?=?Array("Scala",?"Spark")
arr1:?Array[String]?=?Array(Scala,?Spark)
該示例中,聲明arr1為數(shù)組變量時周蹭,沒有使用new關(guān)鍵字趋艘,也沒有指定String類型,系統(tǒng)默認(rèn)根據(jù)元素值凶朗,自動推導(dǎo)出元素的類型為String瓷胧。
沒有使用new關(guān)鍵字,其實(shí)它內(nèi)部調(diào)用了apply方法棚愤,apply是工廠類構(gòu)造器搓萧。等同于下面的寫法:
scala>?val?arr1?=?Array.apply("Scala",?"Spark")
arr1:?Array[String]?=?Array(Scala,?Spark)
//給Array增加元素杂数。下面寫法會出錯,給arr1數(shù)組增加一個元素瘸洛,比如:
scala>?arr1(2)="Hadoop"
java.lang.ArrayIndexOutOfBoundsException:?2
at?.(:16)
at?.()
……
如果需要給Array增加元素揍移,那么此時就應(yīng)該使用ArrayBuffer類型。
ArrayBuffer
//首先導(dǎo)入庫
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的內(nèi)容
scala>?arrbuffer
res26:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,?1,?3,?5)
//向arrbuffer中增加一個數(shù)組
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的內(nèi)容那伐,發(fā)現(xiàn)元素: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的內(nèi)容
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的內(nèi)容
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的內(nèi)容罕邀,發(fā)現(xiàn)第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的內(nèi)容,發(fā)現(xiàn)三個元素:200,?400,?1不見了棍厌。
scala>?arrbuffer
res38:?scala.collection.mutable.ArrayBuffer[Int]?=?ArrayBuffer(10,?11,?3,?5,?100,?1)
//可變數(shù)組變成不可變數(shù)組,此時arr2是一個不可變數(shù)組
scala>?val?arr2?=??arrbuffer.toArray
arr2:?Array[Int]?=?Array(10,?11,?3,?5,?100,?1)
//Array.toBuffer的結(jié)果變成一個ArrayBuffer
scala>?arr2.toBuffer
res40:?scala.collection.mutable.Buffer[Int]?=?ArrayBuffer(10,?11,?3,?5,?100,?1)
//遍歷一個數(shù)組:
scala>?for(elem?<-?arr2)?println(elem)
10
11
3
5
100
1
//遍歷數(shù)組時加上條件
scala>?arr2
res42:?Array[Int]?=?Array(10,?11,?3,?5,?100,?1)
//遍歷時的條件阵具,跳過偶數(shù)位上的元素
scala>?for(i?<-?0?until?(arr2.length,?2))?println(arr2(i))
10
3
100
此時打印出來的結(jié)果,跳過了元素:11定铜、5阳液、1
//從尾部開始遍歷
scala>?for(i?<-?(0?until?arr2.length).reverse)?println(arr2(i))
1
100
5
3
11
10
//對數(shù)組進(jìn)行排序
//導(dǎo)入排序包
scala>?import?scala.util.Sorting
import?scala.util.Sorting
//排序之前
scala>?arr2
res42:?Array[Int]?=?Array(10,?11,?3,?5,?100,?1)
//對arr2進(jìn)行排序
scala>?Sorting.quickSort(arr2)
//排序之后
scala>?arr2
res49:?Array[Int]?=?Array(1,?3,?5,?10,?11,?100)
//顯示arr2中內(nèi)容
scala>?arr2
res49:?Array[Int]?=?Array(1,?3,?5,?10,?11,?100)
//拼接arr2中的每個元素,用逗號拼接揣炕,生成一個字符串
scala>?arr2.mkString(",")
res50:?String?=?1,3,5,10,11,100
//循環(huán)arr2里面的每個元素帘皿,對其進(jìn)行自乘運(yùn)算,并把結(jié)果收集起來畸陡,產(chǎn)生一個新的數(shù)組鹰溜,賦給arr3
scala>?val?arr3?=?for(i?<-?arr2)?yield?i*i
arr3:?Array[Int]?=?Array(1,?9,?25,?100,?121,?10000)
//?for循環(huán)再加上if條件判斷,仍然是循環(huán)arr2里面的每個元素丁恭,對其進(jìn)行自乘運(yùn)算曹动,并把結(jié)果收集起來,產(chǎn)生一個新的數(shù)組牲览,賦給arr3
scala>?val?arr3?=?for(i?<-?arr2?if?i%3==0)?yield?i*i
arr3:?Array[Int]?=?Array(9)
此時arr3中只有一個元素墓陈。
//在scala實(shí)際會用它的函數(shù)式編程來實(shí)現(xiàn)以上代碼
scala>?arr2.filter(_%3?==0).map(i?=>?i*i)
res61:?Array[Int]?=?Array(9)
這種寫法非常優(yōu)雅簡潔,生成的結(jié)果跟上面一樣第献。map本身是一個函數(shù)贡必,里面?zhèn)魅氲膮?shù)仍然是一個函數(shù)。
//上一行示例中的括號庸毫,其實(shí)可以改成花括號仔拟。
scala>?arr2.filter{_%3?==0}.map{i?=>?i*i}
res62:?Array[Int]?=?Array(9)
//甚至可以省略map前面的點(diǎn)號
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)
//對其進(jìn)行增加元素操作
scala>?persons?+=?("Flink"?->?5)
res67:?persons.type?=?Map(Hadoop?->?11,?Spark?->?6,Flink?->?5)
//對其進(jìn)行減元素操作
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函數(shù)用于獲取某個元素
//首先查看persons的內(nèi)容
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
//循環(huán)遍歷Map中的元素
scala>?for((key,value)?<-persons)?println("key:"+key+",value:"+value)
key:Hadoop,value:11
key:Spark,value:6
//注意,此時(key,value)其實(shí)是一個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
一個元組里面有很多不同的類型的元素羡洛,接收函數(shù)的多個參數(shù)時挂脑,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