第3課 Scala中Array、Map、Tuple實戰

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容