Scala學習(四)映射和元組

1.構造映射

映射其實就是Map,Scala中映射分爲可變映射和不可變映射。java

不可變映射其值不能改變,構造方式以下:數組

從上面咱們能夠看到,當咱們嘗試去改變不可變映射的值時,報錯了。而且這裏注意看下咱們的Map是 scala.collection.immutable.Map[String,Int] 注意immutable包,他表示不可變,這裏能夠與後續的可變映射的包名做對比函數

若是你須要構造一個可變映射,請這樣作:使用 scala.collection.mutable.Mapspa

若是你想從一個空的映射開始,你須要選定一個映射實現並給出類型參數:scala

在Scala中映射是對偶的集合。對偶簡單地說就是兩個值構成的組,這兩個值並不必定是同一個類型,好比("HYC",10)。對象

-> 操做符用來建立對偶  "HYC" -> 10 產出的代碼是("HYC",10),所以我麼你徹底能夠這樣來定義映射:排序

2.獲取映射中的值

獲取值得方法前面咱們已經使用了ip

咱們使用()來獲取值,和數組很像,可是數組()當中是座標,映射當中()是key。io

--------------------------------------table

要檢查映射中是否有某個指定的鍵,能夠用contains方法

因爲這樣的組合十分廣泛,所以Scala中提供了一個快捷方法:

3.更新映射中的值

更新映射中的值,相似於賦值的操做,map變量是一個可變映射

針對已經有的值,會採用覆蓋更新操做。

針對沒有的值,會從新生成一個映射

若是咱們想要在映射中添加多個關係,能夠用+=操做:

對應的,移除某個鍵對應的值,能夠用-=操做:

--------------------------------------

你不可能更新一個不可變映射,但你能夠經過其餘方式獲取相同的操做——獲取一個包含所須要的更新的新映射:

而且這種操做會將重複的映射進行更新。

同理,咱們也能夠更新var變量

要從不可變映射中移除某個鍵,你能夠用 - 操做符

總結:可變映射用 +=、-=。不可變映射用+、-。爲何不可變不能用+=、-=?由於+=、-=不會生成新的映射,實在原來的映射中改變,所以不可變映射不能用+=、-=。而可變數組不能用+、-麼?實際上是能夠的,可是經過+、-操做後會生成新的映射,這對於可變數組來講有些多此一舉,可是對於不可變映射來講讓它有課能夠「改變」的可能。

4.迭代映射

以下這段超簡單的循環便可遍歷映射中的全部鍵/值對偶

for ( (k , v) <- 映射 ) 處理k和v

 

若是要反轉一個映射——交換鍵和值得位置,能夠用

for ( (k , v) <- 映射 ) yield (v , k)

若是處於某種緣由,咱們只須要訪問鍵或值,向Java同樣,則能夠用keySet和values方法。

keySet方法返回一個Set集合

values方法返回一個Iterable

注:在Scala中咱們把(k,v)叫作一個元組,映射不過是2維的元組的集合

5.映射排序

在操做映射時,咱們須要一個選定的實現:哈希表或者平衡樹。默認狀況下,Scala給的是哈希表。哈希表沒有對鍵進行排序,而且仍是亂序,若是咱們須要有序的映射,咱們須要實現一個樹形映射:

SortedMap是一個樹形的映射,所以是有序的,而且他是一個可變映射(老版本是不可變的)

若是要安插入順序訪問全部的鍵,可使用LinkedHashMap:

6.與Java相互轉化

Scala映射與Java映射之間的轉換:

1.Java映射轉Scala映射:

須要添加以下引用 

import scala.collection.JavaConversions.mapAsScalaMap

2.Scala映射轉Java映射:

須要添加以下引用

import scala.collection.JavaConversions.mapAsJavaMap

7.元組

映射是鍵/值對偶的集合。對偶是元組(tuple)的最簡單形態,元組是不一樣類型的值得彙集。

注:對偶是二元元組的叫法。

元組的值是經過將單個的值包含在圓括號中構成。例如:

(1, 3.14, "Fred")

它是一個元組,類型爲:

Tuple3[Int, Double, java.lang.String]  也能夠寫爲 (Int, Double, java.lang.String)

因而可知,元組最多支持22元

--------------------------------------

元組如何訪問?好比有以下元組:

val t = (1, 3.14, "Fred")

你就能夠用方法_一、_二、_3訪問其元組:

說明:你能夠把t._2 寫爲t 2(用空格而不是句點),但不能寫成t_2。

--------------------------------------

咱們還能夠用元組來做爲承接變量或者函數返回值,好比:

將咱們以前定義的元組 t 賦值給一個新的元組對象,遠足中定義的各個部件將都會被賦值

有時咱們並不須要全部的部件,此時咱們能夠將不須要的位置上用 _ 表示。

注:元組中定義的部件都是常量val。

有時咱們的韓式須要返回不僅一個值的狀況。此時咱們能夠用元組做爲函數的返回值類型。

8.zip操做

使用元組的緣由之一是把多個值綁定在一塊兒,以便他們可以一塊兒被處理,一般能夠用數組的zip方法完成。例如:

上面的例子太完美了,有可能兩個數組不同長,這時:

咱們能夠看到zip操做是安位置對應匹配的,匹配不到的就丟棄了。

--------------------------------------

toMap方法能夠將對偶的集合轉換成映射

相關文章
相關標籤/搜索