一、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