Scala核心程式設計 集合(Seq, list, set, Map)

紙上得來終覺淺,絕知此事要躬行!

列表 List-建立List

基本介紹:

Scala中的List 和Java List 不一樣,在Java中List是一個介面,真正存放資料是ArrayList,而

Scala的List可以直接存放資料,就是一個object

,預設情況下Scala的List是不可變的,List屬於序列Seq。

val

List

= scala。collection。immutable。List

object

List

extends

SeqFactory[List]

建立List的應用案例

val list1 = List(1, 2, 3) //建立時,直接分配元素

println(list1)

val list2 = Nil  //空集合

println(list2)

建立List的應用案例小結

1)List 在 scala包物件宣告的,因此不需要引入其它包也可以使用,List 預設是不可變的的集合

2)val List = scala。collection。immutable。List

3)List 中可以放

任何資料型別

,比如 arr1的型別為 List[Any]

4)如果希望得到一個空列表,可以使用

Nil物件

, 在 scala包物件宣告的,因此不需要引入其它包也可以使用

val Nil = scala。collection。immutable。Nil

增加:

向列表中增加元素,

會返回新的列表

/集合物件。

注意

:Scala中List元素的追加形式非常獨特,和Java不一樣。

方式1-在列表的最後增加資料 list1 :+ 8

方式2-在列表的最前面增加資料8 +: list1

方式3-在列表的最後增加資料

1)

符號::表示向集合中  新建集合新增元素。

2)

運算時,集合物件一定要放置在最右邊,

3)

運算規則,從右向左。

4)

::: 運算子是將集合中的每一個元素加入到空集合中去,兩邊都是集合

訪問:

val value1 = list1(1) // 1是索引,表示取出第2個元素。

println(value1)

ListBuffer

ListBuffer是可變的list集合,可以新增,刪除元素,ListBuffer屬於序列

//追一下繼承關係即可

建立:Seq

var

listBuffer = ListBuffer(1,2)

訪問:listBuffer (1)

遍歷 for (item <- listBuffer ) {println(“item=” + item)}

追加:listBuffer += 4  或者 listBuffer 。append(5)  直接改變的listBuffer

list0 = list1 或者 var list2= list0 ++list1   //每個元素新增到list0

刪除 list1。remove(1)

佇列 Queue-基本介紹,佇列的說明:

1)佇列是一個

有序列表

,在底層可以用

陣列

或是

連結串列

來實現。

2)其輸入和輸出要遵循

先入先出

的原則。即:先存入佇列的資料,要先取出。後存入的要後取出

3)在Scala中,由設計者直接給我們提供佇列型別使用。

4)在scala中, 有 scala。collection。mutable。Queue 和 scala。collection。immutable。Queue ,

一般來說

,我們在開發中通常使用可變集合中的佇列。

import scala。collection。mutable

//說明: 這裡的Int是泛型,表示q1佇列只能存放Int型別

//如果希望q1可以存放其它型別,則使用 Any 即可。

val q1 = new mutable。Queue[Int]

println(q1)

追加:

list+= 20

list+= List(1,2,3) //整個加進去

list++= List(2,4,6) //list中每個加進去

入佇列:list。enqueue(9, 8, 7)    //按照佇列的演算法,會將資料新增到佇列的最後

出佇列:list。dequeue()               //按照進入佇列的順序刪除元素(佇列先進先出

佇列 Queue-返回佇列的元素

返回佇列的第一個元素

println(list。

head

) //對佇列本身沒有任何影響

返回佇列最後一個元素

println(list。

last

) //對佇列本身沒有任何影響

返回佇列的尾部

即:

返回除了第一個以外剩餘的元素,

println(list。

tail

級聯使用:這個在遞迴時使用較多:println(list。

tail.tail

對映 Map-基本介紹

Java中的Map回顧:

HashMap是一個散列表(

陣列+連結串列

),它儲存的內容是鍵值對(key-value)對映,Java中的HashMap是

無序

的,

key不能重

復。

Scala中的Map介紹

1)Scala中的Map 和Java類似,也是一個散列表,它儲存的內容也是鍵值對(key-value)對映,Scala中

不可變的Map是有序

的,

可變的Map是無序

的。

2)Scala中,有可變Map (scala。collection。mutable。Map) 和 不可變Map(scala。collection。immutable。Map)

方式1-構造不可變對映

Scala中的不可變Map是有序,構建Map中的元素底層是Tuple2型別。

建立:val map1 = Map(“Alice” -> 10, “Bob” -> 20, “Kotlin” -> “北京”)

注意:

。從輸出的結果看到,輸出順序和宣告順序一致。構建Map集合中,集合中的元素其實是Tuple2型別。預設情況下(即沒有引入其它包的情況下),Map是不可變map。為什麼說Map中的元素是Tuple2 型別 [反編譯或看對應的apply]

方式2-構造可變對映

//需要指定可變Map的包,從輸出的結果看到,輸出順序和宣告順序不一致

val map2 = scala。collection。mutable。Map(“Alice” -> 10, “Bob” -> 20, “Kotlin” -> 30

方式3-建立空的對映

val map3 = new scala。collection。mutable。HashMap[String, Int]

println(map3)

方式4-對偶元組

即建立包含鍵值對的二元組, 和第一種方式等價,只是形式上不同而已。對偶元組 就是隻含有兩個資料的元組。

val map4 = mutable。Map( (“A”, 1), (“B”, 2), (“C”, 3),(“D”, 30) )

對映 Map-取值

方式1-使用map(key)

val value1 = map2

(“Alice”)

println(value1)

說明:如果鍵存在, 返回對應的值物件, 如果鍵不存在, 丟擲異常, 在java中 如果不存在返回null

方式2-使用contains方法檢查是否存在key

// 返回Boolean,如果key存在,則返回true,如果key不存在,則返回false

map4。contains(“B”)

說明

:使用containts先判斷在取值,可以防止異常,並加入相應的處理邏輯

方式3-使用map.get(key).get取值

透過 對映。get(鍵) 這樣的呼叫返回一個Option物件,要麼是Some,要麼是None

var map4 = mutable。Map( (“A”, 1), (“B”, “北京”), (“C”, 3) )

println(map4。get(“X“)) //None

println(map4。get(“X”)。get) //得到Some

取出

方式4-使用map4.getOrElse()取值

getOrElse 方法 : def

getOrElse[V1 >: V](key: K, default: => V1)

說明:如果key存在,返回key對應的值,如果key不存在,返回預設值。在java中底層有很多類似的操作。

如何選擇取值方式建議

1)如果我們確定key是存在的,應該使用map(“key”) ,速度快。

2)如果我們不確定key是否存在, 而且在不存在時,有業務邏輯處理就是用map。contains() 配合 map(“key”)

3)如果只是簡單

希望返回一個值,就使用getOrElse()

對映 Map-對map修改、新增和刪除

更新map的元素

說明:

1)map 是可變的,才能修改,否則報錯

2)如果key存在:則修改對應的值,key不存在,等價於新增一個key-val

新增map元素

刪除map元素

l

對映 Map-對map遍歷: 對map的元素(元組Tuple2物件 )進行遍歷的方式很多,具體如下

val map1 = mutable。Map( (“A”, 1), (“B”, “北京”), (“C”, 3) )

for ((k, v) <- map1) println(k + “ is mapped to ” + v)

for (v <- map1。keys) println(v)

for (v <- map1。values) println(v)

for(v <- map1) println(v)

or(v<-map1) println(v+“key=”+v。_1+“val=”+v。_2)//v是Tuple?

說明:每遍歷一次,返回的元素是Tuple2,取出的時候,可以按照元組的方式來取

集 Set-基本介紹:集是不重複元素的結合

。集不保留順序,預設是以雜湊集實現

Java中Set的回顧:

java中,HashSet是實現Set介面的一個實體類,資料是以雜湊表的形式存放的,裡面的不

能包含重複資料

。Set介面是一種不包含重複元素的 collection,

HashSet中的資料也是沒有順序的

。案例演示:

Scala中Set的說明:預設

情況下,Scala 使用的是

不可變集合

,如果你想使用可變集合,需要引用

scala.collection.mutable

。Set 包

l

Set集合-建立

可變集合的元素新增

mutableSet。add(4) //方式1

mutableSet += 6  //方式2

mutableSet。+=(5) //方式3

如果新增的物件已經存在,則不會重複新增,也不會報錯

可變集合的元素刪除

val set02 = mutable。Set(1,2,4,“abc”)

set02 -= 2 // 運算子形式

set02。-=(4) // ok

set02。remove(“abc”) // 方法的形式,scala的Set可以直接刪除值

println(set02)

遍歷: for (x <- set02)  { println(x) }

學習使人進步,共勉!加油!

相關文章