[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"))
}