1. 程式人生 > >Scala陣列和集合

Scala陣列和集合

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