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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM