1. 程式人生 > >[scala]學習筆記三——集合

[scala]學習筆記三——集合

一、Array

1.定長陣列的定義:
①一種方式:給出長度

scala> val a=new Array[String](5)
a: Array[String] = Array(null, null, null, null, null)				//null是String型別的預設值

②另一種方式,直接利用object Array中的apply方法定義與宣告

scala> val b=Array("Nina","Daming")
b: Array[String] = Array(Nina, Daming)				//類名()=>呼叫object中的apply()方法

2.定長陣列的一些操作

//訪問陣列長度
scala> b.length
res0: Int = 2

//更改陣列中的某一元素
scala> b(1)="sam"
scala> b
res9: Array[String] = Array(Nina, sam)

scala> val c=Array(1,2,3,4)
c: Array[Int] = Array(1, 2, 3, 4)

//陣列求和
scala> c.sum
res2: Int = 10

//陣列求最大值
scala> c.max
res3: Int = 4

//陣列求最小值
scala> c.min
res4: Int = 1

//將陣列變成字串
scala> c.mkString
res5: String = 1234

//將陣列變成字串,並且宣告分隔符
scala> c.mkString(",")
res6: String = 1,2,3,4

3.變長陣列的定義

val c=scala.collection.mutable.ArrayBuffer[Int]()             //定義可變陣列

4.變長陣列的操作

//往可變陣列中新增單個元素:
c+=1    
c+=2
結果:ArrayBuffer(1, 2)

//往可變陣列中新增多個元素
c+=(3,4,5)   
結果:ArrayBuffer(1, 2,3,4,5)

//往可變陣列中新增一個數組
c++=Array(6,7,8,9)
結果:ArrayBuffer(1, 2, 3, 4, 5, 6, 7, 8, 9)

//在第n的位置新增某一元素
c.insert(0,0)     //(第幾位,新增的元素)
結果:ArrayBuffer(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

//刪除某一位的元素
c.remove(1)
結果:ArrayBuffer(0, 2, 3, 4, 5, 6, 7, 8, 9)

//刪除某幾位元素
c.remove(0,2)		//(第幾位開始刪除,刪除幾個)
結果:ArrayBuffer(3, 4, 5, 6, 7, 8, 9)

//刪除末尾的幾個:
c.trimEnd(3)
結果:ArrayBuffer(3, 4, 5, 6)

//把可變陣列變成定長陣列:
c.toArray

5.陣列的遍歷

//一種方式
for(i<-0 until c.length){
    println(c(i))
  }

//另一種方式,更實用
for(ele<-c){
    println(ele)
  }

//倒序遍歷
for(i<-(0 until c.length).reverse){
    println(c(i))
  }

二、List (有順序,且可重複)

1.List[T]:T是泛型,指的是list中的型別,scala會自行推導,因此可以不指明T
2.List的宣告與定義:

scala> val a=List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)

3.連線操作符
1)::

scala> val b=0::a				//把0插在了a前面形成了b
b: List[Int] = List(0, 1, 2, 3, 4)

scala> val d="x"::"y"::"z"::Nil	//字串相互連線形成了新的字串list,倒著連線的
d: List[String] = List(x, y, z)

2)::: 用於連線兩個list

scala> val e=a:::d
e: List[Any] = List(1, 2, 3, 4, x, y, z)			//Any是Int和String的父類

4.訪問list中的元素
1)e.head:返回的是e的第一個元素
2)e.tail:返回的是e除第一個元素之後其他元素組成的列表(偽列表)
3)e.isEmpty:用於判斷e是否為空

scala> e.head
res5: Any = 1
scala> e.tail
res6: List[Any] = List(2, 3, 4, x, y, z)
scala> e.isEmpty
res7: Boolean = false

5.長度可變 List
長度可變的List的操作同長度可變的Array操作相同

//定義變長的List
val a=scala.collection.mutable.ListBuffer[Int]()

//往變長List中新增元素
 a+=1
 a+=2
 a++=List(3,4,5)

//刪除變長List中的一些元素
 a-=1

//將變長List轉變為定長List
 a.toList

6.list的高階函式
1)filter: 起過濾作用

scala> b.filter(x=>x%2==1)		//把b中的奇數給過濾出來了
res8: List[Int] = List(1, 3)

scala> "99 Red Rose".toList.filter(x=>Character.isDigit(x))			//把字串中的數字給過濾出來了
res12: List[Char] = List(9, 9)

2)takeWhile: 起到的也是過濾作用

//過濾到第一個字母o時,就停止過濾,輸出結果,與filter不同
scala> "99 Red Rose".toList.takeWhile(x=>x!='o')			
res13: List[Char] = List(9, 9,  , R, e, d,  , R)

3)map: 把列表中的每個元素進行對映

scala> d.map(x=>x.toUpperCase)		//把d中字母都改成了大寫
res16: List[String] = List(X, Y, Z)

//匿名函式的簡寫,用萬用字元_來簡寫匿名函式
scala> d.map(_.toUpperCase)
res17: List[String] = List(X, Y, Z)

4)flatMap: 把多個list打平,放到一個list中

scala> val q=List(List(1,2,3,4),List(5,6,7,8))
q: List[List[Int]] = List(List(1, 2, 3, 4), List(5, 6, 7, 8))

//使用map時,得出的結果是兩層的list
scala> q.map(_.filter(_%2==0))
res20: List[List[Int]] = List(List(2, 4), List(6, 8))

//使用flatMap,把最終結果放在一層中
scala> q.flatMap(_.filter(_%2==0))
res21: List[Int] = List(2, 4, 6, 8)

7.list的歸約
1)reduceLeft: reduceLeft(op:(T,T)=>T)

scala> a
res22: List[Int] = List(1, 2, 3, 4)

scala> a.reduceLeft(_+_)		//_為萬用字元
res23: Int = 10

2)fold Left: foldLeft(z:U)(op:(U,T)=>U)

scala> a.foldLeft(0)(_+_)			//(z:U) 是需要給定一個初始值
res24: Int = 10

三、Set (無序、不可重複)

Set的用法,同List一樣,但Set是無序,並且不可重複的,剩下的操作都與List相同

scala> var e=Set(1,2,1,3,4,2,3,4,5,6)
e: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 3, 4)

四、Range

1.to: 形成的整數數列為 左閉右閉

scala> 1 to 10
res25: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

scala> 1.to(10)
res26: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

2.until: 形成的數列是 左閉右開

scala> 1 until 10
res27: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9)

五、Stream

1.stream is a lazy range!符號為 #::
2.stream只確定序列的第一個值,其餘的先不求,之後按需求值

scala> val stream=(1 to 100).toStream
stream: scala.collection.immutable.Stream[Int] = Stream(1, ?)

3.訪問Range中的元素:同訪問List一樣
1)stream.head
2)stream.tail

scala> stream.head
res28: Int = 1

scala> stream.tail
res29: scala.collection.immutable.Stream[Int] = Stream(2, ?)

六、Tuple(元組)

1.元組要是隻有兩個元素,稱為pair
2.元組定義:

//方法一:
scala> val t=(1,2)
t: (Int, Int) = (1,2)

//方法二:
scala> 1->2
res30: (Int, Int) = (1,2)

3.訪問元組中的元素:A._x

scala> t._1
res31: Int = 1

4.遍歷元組

//元組的遍歷,需要注意一下,與其他集合的遍歷方法不同
for(i<-0 until t.productArity){
    println(t.productElement(i))
  }

5.使用元組的一個例子

scala> a
res32: List[Int] = List(1, 2, 3, 4)

//定義了一個函式,最終輸出一個元組
//元組的第一個值用於list計數
//第二個值記錄所有list元素的加和
//第三個值記錄每個值與自身乘積的加和
scala> def sumQ(l:List[Int]):(Int,Int,Int)={
      l.foldLeft(0,0,0)((t,v)=>(t._1+1,t._2+v,t._3+v*v))
}

scala> sumQ(a)
res33: (Int, Int, Int) = (4,10,30)

七、Map

1.Map的定義:Map[K,V]

scala> val map=Map(1->"Nina",2->"Linda")
map: scala.collection.immutable.Map[Int,String] = Map(1 -> Nina, 2 -> Linda)

2.有關Map的一些操作
1)通過某個key值取value值

scala> map(1)
res34: String = Nina

//還可以通過get來取值
scala> map.get(1)
res0: Option[String] = Some(Nina)

scala> map.get(1).get
res1: String = Nina

//getOrElse 當查詢的關鍵字不存在時,也不會報錯,並可以給出一個預設的值
scala> map.getOrElse(3,"Lily")
res2: String = Lily

2)判斷是否包含某個key值

scala> map.contains(2)
res35: Boolean = true

3)檢視Map中的key集合

scala> map.keys
res36: Iterable[Int] = Set(1, 2)

4)檢視Map中的values集合

scala> map.values
res37: Iterable[String] = MapLike(Nina, Linda)

5)Map中新新增一個鍵值對

scala> map
res39: scala.collection.immutable.Map[Int,String] = Map(1 -> Nina, 2 -> Linda)
scala> map+(3->"Nancy")
res38: scala.collection.immutable.Map[Int,String] = Map(1 -> Nina, 2 -> Linda, 3 -> Nancy)

6)Map中減掉一個鍵值對

scala> map
res39: scala.collection.immutable.Map[Int,String] = Map(1 -> Nina, 2 -> Linda)
scala> map-(2)
res40: scala.collection.immutable.Map[Int,String] = Map(1 -> Nina)

7)Map中新增多個元素 ++

scala> map
res41: scala.collection.immutable.Map[Int,String] = Map(1 -> Nina, 2 -> Linda)
scala> map++List(3->"Amy",4->"Daming")
res42: scala.collection.immutable.Map[Int,String] = Map(1 -> Nina, 2 -> Linda, 3 -> Amy, 4 -> Daming)

8)Map中減掉多個元素

scala> map++List(3->"Amy",4->"Daming")--List(1,2)			//List中只給出關鍵字即可
res43: scala.collection.immutable.Map[Int,String] = Map(3 -> Amy, 4 -> Daming)

9)Map遍歷

//一種方式:			比較直接且方便
for((key,value)<-map){
    println(key+" : "+value)
  }
  
  //另一種方式:
  for(key<-map.keys){
    println(key+" : "+map.getOrElse(key,"N"))
  }