Scala入門到放棄——集合(十一)

十五、集合

Scala提供了一套很好的集合實現,提供了一些集合類型的抽象。

Scala 集合分爲可變的和不可變的集合:

  • 可變集合可以在適當的地方被更新或擴展。這意味着你可以修改,添加,移除一個集合的元素。
  • 不可變集合(默認)類永遠不會改變。不過,你仍然可以模擬添加,移除或更新操作。但是這些操作將在每一種情況下都返回一個新的集合,同時使原來的集合不發生改變。

集合中基本結構:

img

序列

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集合的轉換

https://docs.scala-lang.org/zh-cn/overviews/collections/conversions-between-java-and-scala-collections.html

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)
  }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章