第3課 Scala中Array塘淑、Map、Tuple實(shí)戰(zhàn)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末刁俭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子韧涨,更是在濱河造成了極大的恐慌牍戚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虑粥,死亡現(xiàn)場離奇詭異如孝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)娩贷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門第晰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人彬祖,你說我怎么就攤上這事茁瘦。” “怎么了储笑?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵甜熔,是天一觀的道長。 經(jīng)常有香客問我突倍,道長腔稀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任赘方,我火速辦了婚禮烧颖,結(jié)果婚禮上弱左,老公的妹妹穿的比我還像新娘窄陡。我一直安慰自己,他們只是感情好拆火,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布跳夭。 她就那樣靜靜地躺著涂圆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪币叹。 梳的紋絲不亂的頭發(fā)上润歉,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音颈抚,去河邊找鬼踩衩。 笑死,一個胖子當(dāng)著我的面吹牛贩汉,可吹牛的內(nèi)容都是我干的驱富。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼匹舞,長吁一口氣:“原來是場噩夢啊……” “哼褐鸥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赐稽,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤叫榕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后姊舵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晰绎,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年括丁,在試婚紗的時候發(fā)現(xiàn)自己被綠了寒匙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡躏将,死狀恐怖锄弱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祸憋,我是刑警寧澤会宪,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蚯窥,受9級特大地震影響掸鹅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拦赠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一巍沙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荷鼠,春花似錦句携、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽削咆。三九已至,卻和暖如春蠢笋,著一層夾襖步出監(jiān)牢的瞬間拨齐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工昨寞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞻惋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓援岩,卻偏偏與公主長得像熟史,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窄俏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容