十五、集合
Scala提供了一套很好的集合實現,提供了一些集合類型的抽象。
Scala 集合分爲可變的和不可變的集合:
- 可變集合可以在適當的地方被更新或擴展。這意味着你可以修改,添加,移除一個集合的元素。
- 不可變集合(默認)類永遠不會改變。不過,你仍然可以模擬添加,移除或更新操作。但是這些操作將在每一種情況下都返回一個新的集合,同時使原來的集合不發生改變。
集合中基本結構:
序列
Vector(向量)
Vector是ArrayBuffer的不可變版本:有下標,支持快速的隨機訪問,樹形結構實現
scala> var vector=Vector(1,2,3)
vector: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3)
scala> var vector=for(i<- 0 to 10 by 2) yield i
vector: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 2, 4, 6, 8, 10)
Ranage(區間)
一個整數序列
scala> var range=new Range(1,10,2) // 類似與until
range: scala.collection.immutable.Range = inexact Range 1 until 10 by 2
scala> var range=Range(1,10 ,2) // 類似與until
range: scala.collection.immutable.Range = inexact Range 1 until 10 by 2
scala> var range=0 to 10 by 2
range: scala.collection.immutable.Range = Range 0 to 10 by 2
scala> var range=0 until 10 by 2
range: scala.collection.immutable.Range = Range 0 until 10 by 2
List (不可變列表)
scala.collection.inmutable.List
Scala 列表類似於數組,它們所有元素的類型都相同,但是它們也有所不同:列表是不可變的,值一旦被定義了就不能改變,其次列表 具有遞歸的結構(也就是鏈接表結構)而數組不是。
創建
val list = List(1, 2, 3, 4, 5)
使用
println(list(0))
List與Array的區別
//list(2) = 10 // error: List一旦創建,已有元素的值不能改變,可以使用添加元素或刪除元素生成一個新的集合返回
空列表(Nil)
val list2 = Nil // Nil 返回一個空集合 List()
元素的追加
Note:向列表中增加元素,會返回新的列表/集合對象
val list5 = List(4,5,6)
val list6 = list5:+7 // 在列表的末尾加入元素7 並返回一個新的列表
val list7 = 3+:list5 // 在列表的開頭加入元素3 並返回一個新的列表
println(list5.mkString(",")) //4,5,6
println(list6.mkString(",")) //4,5,6,7
println(list7.mkString(",")) //3,4,5,6
::和:::操作符介紹
::
表示從給定的頭和尾新建集合,添加元素整體
:::
表示新建集合,添加集合中的一個個的元素內容
val list3 = List(1, 2, 3)
val list4 = List("a", "b") :: list3 // 將List("a","b") 作爲整體添加到list3的集合頭部
val list8 = List("a", "b") ::: list3 // 將List("a","b")內容展開,添加到list3集合的頭部
println(list4.mkString(",")) // List(a, b),1,2,3
println(list8.mkString(",")) // a,b,1,2,3
ListBuffer (可變列表)
scala.collection.mutable.ListBuffer
是一個可變的列表集合
創建
# 注意,需要導入可變集合的類
import scala.collection.mutable._
val list01 = ListBuffer(4, 5, 6)
使用
list01.append(7) // 追加
println(list01.mkString(","))
list01 += 8 // 另外一種追加
println(list01.mkString(","))
list01 ++= List(9, 10) // 將集合中的元素追加到ListBuffer中
println(list01.mkString(","))
3 +=: list01 // 將3置於ListBuffer的頭部
println(list01.mkString(","))
list01.remove(1) // 刪除下標爲1的元素
println(list01.mkString(",")) //3,5,6,7,8,9,10
list01 -= 5 // 刪除元素爲5
println(list01.mkString(",")) //3,6,7,8,9,10
// 刪除元素爲6
println((list01 - 6).mkString(",")) // 3,7,8,9,10
注意:
集合中的操作符中有
=
,表示對集合中元素的操作,不會產生新的集合 集合中的操作符中沒有
=
,表示操作結束後,會產生返回一個新的結合
Set(不可變)
scala> val s=scala.collection.immutable.Set(1,2,3)
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3)
scala> for(i <- s) print(i+",") 1,2,3,
Set (可變)
val s=scala.collection.mutable.Set(1,2,3)
s-=1
s+=(4,5,6)
s.remove(5)
for(i <- s) print(i+",")
Map
創建
# 創建不可變的map集合
scala> val map = Map("bj" -> "北京", "tj" -> "天津", "sh" -> "上海")
map: scala.collection.immutable.Map[String,String] = Map(bj -> 北京, tj -> 天津, sh -> 上海)
# 創建可變的map集合
scala> val map = scala.collection.mutable.Map[String,String]("bj" -> "北京", "tj" -> "天津", "sh" -> "上海")
map: scala.collection.mutable.Map[String,String] = Map(tj -> 天津, bj -> 北京, sh -> 上海)
scala> map("bj")="aa"
scala> map
res9: scala.collection.mutable.Map[String,String] = Map(tj -> 天津, bj -> aa, sh -> 上海)
# 另外一種創建map集合的方式
scala> val map = scala.collection.mutable.Map(("bj","北京"),("tj","天津"))
map: scala.collection.mutable.Map[String,String] = Map(tj -> 天津, bj -> 北京)
使用
# 新增kv
scala> map+=(("zz","鄭州"))
res8: map.type = Map(tj -> 天津, zz -> 鄭州, bj -> aa, sh -> 上海)
# 新增另一種方法 mp.put(k,v)
# 移除kv
scala> map-=(("zz"))
res10: map.type = Map(tj -> 天津, bj -> aa, sh -> 上海)
// 根據k獲取v
scala> map("tj")
res12: String = 天津
# 可排序的map集合
scala> val map = scala.collection.mutable.SortedMap[String,String]("bj" -> "北京", "tj" -> "天津", "sh" -> "上海","aq"->"安慶")
map: scala.collection.mutable.SortedMap[String,String] = TreeMap(aq -> 安慶, bj -> 北京, sh -> 上海, tj -> 天津)
遍歷
scala> for((k,v) <- map) println(k + " " + v)
aq 安慶
bj 北京
sh 上海
tj 天津
Tuple(元組)
在 Scala 中,元組是一個可以容納不同類型元素的類。 元組是不可變的。
創建
// 創建
val t1 = (1, "zs", false, 10.0)
println(t1.getClass) //Tuple4
使用
使用下劃線語法來訪問元組中的元素。 ‘tuple._n’ 取出了第 n 個元素(假設有足夠多元素)
// 使用
println(t1._1)
println(t1._2)
println(t1._3)
println(t1._4)
// 或使用
// 通過productElement獲取元組內容
println(t1.productElement(0)) // 下標
元組的遍歷
// 元組的遍歷
for(item <- t1.productIterator){
println("item:"+item)
}
scala的解釋器窗口,要寫入多行代碼時,可以使用
:paste
, 結束後使用ctrl+d
Java和Scala集合的轉換
package com.baizhi.array
import scala.collection.mutable._
import scala.collection.JavaConverters._
object ArrayToListDemo01 {
def main(args: Array[String]): Unit = {
// scala集合轉爲java.util.List
val arr = ArrayBuffer[Integer](1, 2, 3, 4, 5).asJava
//A.m1(arr)
//println(arr.getClass)
// java.util.List轉爲scala集合
val arr2 = arr.asScala
println(arr2.getClass)
}
}