Scala陣列和集合
阿新 • • 發佈:2019-01-03
一、scala陣列
陣列定義1: var arr = new Array[String](3) String:儲存的元素型別 3:儲存3個元素 新增元素: arr(1) = "hello" 陣列定義2: val arr1 = Array[Int](1,2,3,4,5,6) 改變內容:arr1(1) = 18 新增元素:arr1 += 22 長度不可以改變
二、陣列方法
1、map(對映)
對映: 2 4 6 對映關係:f(x) = x*5 對應對映關係:10 20 30
例:
scala> var arr = Array(1,2,3) arr: Array[Int]= Array(1, 2, 3) scala> arr.map((x: Int) => x * 10) res12: Array[Int] = Array(10, 20, 30) scala> arr res13: Array[Int] = Array(1, 2, 3) scala> res12 res14: Array[Int] = Array(10, 20, 30)
2、flatten(扁平化操作)
scala> var arr = Array("hello Beijing","hello China") arr: Array[String] = Array(hello Beijing, hello China) scala> arr.length res6: Int = 2 scala> arr.map(_.split(" ")) res7: Array[Array[String]] = Array(Array(hello, Beijing), Array(hello, China)) scala> arr.map(_.split(" ")).flatten res8: Array[String] = Array(hello, Beijing, hello, China)
3、flatMap(相當於先map操作再flatten)
scala> arr res9: Array[String]= Array(hello Beijing, hello China) scala> arr.flatMap(_.split(" ")) res10: Array[String] = Array(hello, Beijing, hello, China)
4、foreach(遍歷陣列中的元素)
scala> res10.foreach(x => println(x))
hello
Beijing
hello
China
scala>
5、GroupBy(分組)
scala> arr res13: Array[String] = Array(hello Beijing, hello China) scala> arr.flatMap(_.split(" ")).groupBy(x => x) res14: scala.collection.immutable.Map[String,Array[String]] = Map(Beijing -> Array(Beijing), China -> Array(China), hello -> Array(hello, hello)) //Scala簡易WordCount scala> arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length)) res16: scala.collection.immutable.Map[String,Int] = Map(Beijing -> 1, China -> 1, hello -> 2)
6、sortBy(排序)
scala> arr res13: Array[String] = Array(hello Beijing, hello China)
//正序 scala> arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length)).toList.sortBy(x => x._2) res18: List[(String, Int)] = List((Beijing,1), (China,1), (hello,2))
//倒序 scala> arr.flatMap(_.split(" ")).groupBy(x => x).map(x => (x._1,x._2.length)).toList.sortBy(x => -x._2) res19: List[(String, Int)] = List((hello,2), (Beijing,1), (China,1))
三、集合
scala集合有兩種型別:可變mutable 不可變Immutable val b = List(2,4,6) 不可變集合:內容不可變(陣列內容可改變) 長度不可變 可變集合: 注意:需要導包 import scala.collection.mutable._ val buff = ArrayBuffer(2,3,4) 內容可變: buff(1) = 300 長度可變:buff += 200
例:
scala> val s = List(1,2,3) s: List[Int] = List(1, 2, 3) scala> s(1) = 8 <console>:13: error: value update is not a member of List[Int] s(1) = 8 ^ scala> val b = List(2,3,4) b: List[Int] = List(2, 3, 4) scala> b += 20 <console>:13: error: value += is not a member of List[Int] b += 20 ^ scala> import scala.collection.mutable._ import scala.collection.mutable._ scala> val buff = ArrayBuffer(2,3,4) buff: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 3, 4) scala> buff += 200 res23: buff.type = ArrayBuffer(2, 3, 4, 200) scala> buff(1) = 300 scala> buff res25: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(2, 300, 4, 200) scala> scala.collection.mutable. AVLIterator History PriorityQueueProxy AVLTree ImmutableMapAdaptor Publisher AbstractBuffer ImmutableSetAdaptor Queue AbstractIterable IndexedSeq QueueProxy AbstractMap IndexedSeqLike ResizableArray AbstractSeq IndexedSeqOptimized RevertibleHistory AbstractSet IndexedSeqView Seq AnyRefMap Iterable SeqLike ArrayBuffer LazyBuilder Set ArrayBuilder Leaf SetBuilder ArrayLike LinearSeq SetLike ArrayOps LinkedEntry SetProxy ArraySeq LinkedHashMap SortedSet ArrayStack LinkedHashSet Stack BitSet LinkedList StackProxy Buffer LinkedListLike StringBuilder BufferLike ListBuffer Subscriber BufferProxy ListMap SynchronizedBuffer Builder LongMap SynchronizedMap Cloneable Map SynchronizedPriorityQueue DefaultEntry MapBuilder SynchronizedQueue DefaultMapModel MapLike SynchronizedSet DoubleLinkedList MapProxy SynchronizedStack DoubleLinkedListLike MultiMap Traversable FlatHashTable MutableList TreeSet GrowingBuilder ObservableBuffer Undoable HashEntry ObservableMap UnrolledBuffer HashMap ObservableSet WeakHashMap HashSet OpenHashMap WrappedArray HashTable PriorityQueue WrappedArrayBuilder scala> val lb = scala.collection.mutable.ListBuffer(11,22,33) lb: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 22, 33) scala> lb(1) = 334 scala> lb += 222 res27: lb.type = ListBuffer(11, 334, 33, 222) scala> lb res28: scala.collection.mutable.ListBuffer[Int] = ListBuffer(11, 334, 33, 222)
四、長度可變的陣列
建立長度可變陣列: val ab = scala.collection.mutable.ArrayBuffer(2,3,4) 長度可變: ab += 440
五、Seq序列
不可變的序列 在scala中列表要麼為空(Nil表示空列表) head元素上加上一個tail列表 head:取頭元素 tail:取尾元素(除了頭全是尾) 5::Nil 空列表的頭加入一個元素 1::2::3::Nil 空列表前加入三個元素1,2,3 + 字串的拼接 ++ 兩個集合相加 ++: 合併集合 .+: 頭部追加元素 :+ 尾部追加元素 ::: 兩個集合相加 count 統計個數 filter 過濾 sortBy 排序 sortWwith 排序 grouped 分組 fold 摺疊 foldLeft 左摺疊 foldRight 右摺疊 reduce 聚合 aggregate 先區域性聚合再全域性聚合 zip 拉鍊 sum 求和
例:
scala> import scala.collection.immutable._ import scala.collection.immutable._ scala> Nil res30: scala.collection.immutable.Nil.type = List() scala> val l = List(2,1,5,8,9) l: List[Int] = List(2, 1, 5, 8, 9) scala> l.head res31: Int = 2 scala> l.tail res32: List[Int] = List(1, 5, 8, 9) scala> 5::Nil res33: List[Int] = List(5) scala> val s = Nil s: scala.collection.immutable.Nil.type = List() scala> 3::s res34: List[Int] = List(3) scala> s res35: scala.collection.immutable.Nil.type = List() scala> res34 res36: List[Int] = List(3) scala> 1::2::3::Nil res37: List[Int] = List(1, 2, 3) scala> val ll = List(3,4,5) ll: List[Int] = List(3, 4, 5) scala> ll + "a" res38: String = List(3, 4, 5)a scala> ll res39: List[Int] = List(3, 4, 5) scala> ll ++ List(6,7) res40: List[Int] = List(3, 4, 5, 6, 7) scala> ll ++:List(6,7,8) res41: List[Int] = List(3, 4, 5, 6, 7, 8) scala> ll res42: List[Int] = List(3, 4, 5) scala> ll.+:(55) res43: List[Int] = List(55, 3, 4, 5) scala> ll:+(66) res44: List[Int] = List(3, 4, 5, 66) scala> ll res45: List[Int] = List(3, 4, 5) scala> val lll = List(33,44) lll: List[Int] = List(33, 44) scala> ll::lll res46: List[Any] = List(List(3, 4, 5), 33, 44) scala> ll:::lll res47: List[Int] = List(3, 4, 5, 33, 44) scala> ll res48: List[Int] = List(3, 4, 5) scala> ll.count(x => x>4) res49: Int = 1 scala> ll.count(x => x>=4) res50: Int = 2 scala> ll.filter(x => x >+5) <console>:19: error: value >+ is not a member of Int ll.filter(x => x >+5) ^ scala> ll.filter(x => x >=5) res52: List[Int] = List(5) scala> ll.filter(x => x >= 5) res53: List[Int] = List(5) scala> val ls = List(6,2,1,3,8,7) ls: List[Int] = List(6, 2, 1, 3, 8, 7) scala> ls.sortBy(x => x) res54: List[Int] = List(1, 2, 3, 6, 7, 8) scala> ls.sortBy(x => -x) res55: List[Int] = List(8, 7, 6, 3, 2, 1) scala> ls res56: List[Int] = List(6, 2, 1, 3, 8, 7) scala> val sw = List(("h",2),("r",1),("m",4)) sw: List[(String, Int)] = List((h,2), (r,1), (m,4)) scala> sw.sortBy(x => x._2) res57: List[(String, Int)] = List((r,1), (h,2), (m,4)) scala> sw.sortWith((x,y) => x._2 > y._2) res58: List[(String, Int)] = List((m,4), (h,2), (r,1)) scala> val sw = List(("h",2),("r",2),("m",4)) sw: List[(String, Int)] = List((h,2), (r,2), (m,4)) scala> sw.groupd(2) <console>:19: error: value groupd is not a member of List[(String, Int)] sw.groupd(2) ^ scala> sw.grouped(2) res60: Iterator[List[(String, Int)]] = non-empty iterator scala> sw.grouped(2).toList res61: List[List[(String, Int)]] = List(List((h,2), (r,2)), List((m,4))) scala> val l2 = List(1,3,4) l2: List[Int] = List(1, 3, 4) scala> l2.fold(0)((x,y) => x+y) res62: Int = 8 scala> l2.fold(1)((x,y) => x+y) res63: Int = 9 scala> l2.fold(2)((x,y) => x+y) res64: Int = 10 scala> ls.fold(2)((x,y) => x-y) res65: Int = -25 scala> ls res66: List[Int] = List(6, 2, 1, 3, 8, 7) scala> l2.fold((x,y) => x-y) <console>:19: error: missing parameter type l2.fold((x,y) => x-y) ^ <console>:19: error: missing parameter type l2.fold((x,y) => x-y) ^ <console>:19: error: missing argument list for method fold in trait TraversableOnce Unapplied methods are only converted to functions when a function type is expected. You can make this conversion explicit by writing `fold _` or `fold(_)(_)` instead of `fold`. l2.fold((x,y) => x-y) ^ scala> l2.fold(2)((x,y) => x-y) res68: Int = -6 scala> l2.fold(2)(_+_) res69: Int = 10 scala> l2.foldLeft(2)(_+_) res70: Int = 10 scala> l2.foldRight(2)(_+_) res71: Int = 10 scala> l2 res72: List[Int] = List(1, 3, 4) scala> l2.fold(0)(_ - _) res73: Int = -8 scala> l2.foldRight(0)(_ - _) res74: Int = 2 scala> l2.foldLeft(0)(_ - _) res75: Int = -8 scala> l2 res76: List[Int] = List(1, 3, 4) scala> l2.reduce(_+_) res77: Int = 8 scala> l2.reduce(_-_) res78: Int = -6 scala> l2 res79: List[Int] = List(1, 3, 4) scala> l2.aggregate(0)(_+_,_+_) res80: Int = 8 scala> val l3 = List(6,7,8) l3: List[Int] = List(6, 7, 8) scala> l2.zip(l3) res81: List[(Int, Int)] = List((1,6), (3,7), (4,8)) scala> val l3 = List(6,7,8,9) l3: List[Int] = List(6, 7, 8, 9) scala> l2.zip(l3) res82: List[(Int, Int)] = List((1,6), (3,7), (4,8)) scala> l2 res83: List[Int] = List(1, 3, 4) scala> l2.sum res84: Int = 8
其中
scala> l2 res73: List[Int] = List(1, 3, 4) //相當於 1-(3-(4-0) 右摺疊初始值在右 scala> l2.foldRight(0)(_ - _) res74: Int = 2 //相當於 (0-1)-3)-4) scala> l2.foldLeft(0)(_ - _) res75: Int = -8
六、Set
無序的,不重複的集合 Set不可變的集合 val l5 = collection.mutable.HashSet(2,3,4) HashSet可變的集合 remove 刪除元素 -= 刪除元素 ++ 集合相加 ++= 相加並賦值
例:
scala> val l4 = List(1,2,2,4) l4: List[Int] = List(1, 2, 2, 4) scala> val s = Set(2,3,4) s: scala.collection.immutable.Set[Int] = Set(2, 3, 4) scala> val s = Set(2,3,3,4) s: scala.collection.immutable.Set[Int] = Set(2, 3, 4) scala> s += 5 <console>:19: error: value += is not a member of scala.collection.immutable.Set[Int] s += 5 ^ scala> collection.mutable.Hash HashEntry HashMap HashSet scala> val l5 = collection.mutable.HashSet(2,3,4) l5: scala.collection.mutable.HashSet[Int] = Set(2, 3, 4) scala> l5 += 6 res86: l5.type = Set(2, 6, 3, 4) scala> l5 res87: scala.collection.mutable.HashSet[Int] = Set(2, 6, 3, 4) scala> l5,remove(2) <console>:1: error: ';' expected but ',' found. l5,remove(2) ^ scala> l5.remove(2) res88: Boolean = true scala> l5 res89: scala.collection.mutable.HashSet[Int] = Set(6, 3, 4) scala> l5 -= 3 res90: l5.type = Set(6, 4) scala> l4 res91: List[Int] = List(1, 2, 2, 4) scala> l5 res92: scala.collection.mutable.HashSet[Int] = Set(6, 4) scala> l4 ++ l5 res93: List[Int] = List(1, 2, 2, 4, 6, 4) scala> l5 ++= Set(2,7) res94: l5.type = Set(2, 6, 7, 4)
七、Map
不可變Map:val m = Map[String,Int]("hello"->2,"world"->8)
可變Map:
getOrElse:如果有值返回值,沒有返回預設值
例:
scala> val m = Map[String,Int]("hello"->2,"Beijing"->8) m: scala.collection.immutable.Map[String,Int] = Map(hello -> 2, Beijing -> 8) scala> m("hello") res95: Int = 2 scala> m("hello") = 4 <console>:19: error: value update is not a member of scala.collection.immutable.Map[String,Int] m("hello") = 4 ^ scala> val m2 = collection.mutable.HashMap[String,Int]() m2: scala.collection.mutable.HashMap[String,Int] = Map() scala> m2.put("lisi",18) res97: Option[Int] = None scala> m2 res98: scala.collection.mutable.HashMap[String,Int] = Map(lisi -> 18) scala> m2 += "weight" -> 120 res99: m2.type = Map(lisi -> 18, weight -> 120) scala> m2.remove("lisi") res100: Option[Int] = Some(18) scala> m2 res101: scala.collection.mutable.HashMap[String,Int] = Map(weight -> 120) scala> m2 -= "weight" res102: m2.type = Map() scala> m2 res103: scala.collection.mutable.HashMap[String,Int] = Map() scala> m2 += "weight" -> 120 res104: m2.type = Map(weight -> 120) scala> m2.get("weight") res105: Option[Int] = Some(120) scala> m2.getOrElse("zhangsan",18) res106: Int = 18 scala> m2 res107: scala.collection.mutable.HashMap[String,Int] = Map(weight -> 120) scala> m2 += "zhangsan" -> 28 res108: m2.type = Map(zhangsan -> 28, weight -> 120) scala> m2.getOrElse("zhangsan",18) res109: Int = 28
八、元組tuple
元組中可以是任意元素 val t = (2,true,"lisi",Unit) 取元素:t._1 對偶元組:有兩個元素的元組
例:
scala> val t = (2,true,"lisi",Unit) t: (Int, Boolean, String, Unit.type) = (2,true,lisi,object scala.Unit) scala> t res110: (Int, Boolean, String, Unit.type) = (2,true,lisi,object scala.Unit) scala> t._1 res111: Int = 2 scala> t._3 res112: String = lisi scala> val t1 = ("lisi",18) t1: (String, Int) = (lisi,18) scala> t1.swap res113: (Int, String) = (18,lisi) scala> val t3 = Array(("lisi",18),("zhangsan",16)) t3: Array[(String, Int)] = Array((lisi,18), (zhangsan,16)) //求t3中的年齡的和 scala> t3.foldLeft(0)(_+_._2) res114: Int = 34