zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    hdu 1312 ( Red and Black )
    hdu 1429 ( 胜利大逃亡(续) )
    zjut 小X的苹果
    hdu 1253 ( 胜利大逃亡 )
    许多事
    1198 ( Farm Irrigation )
    hdu 1241 Oil Deposits
    hdu 1242 ( Rescue )
    hdu 1240 ( Asteroids! )
    zoj2966 build the electric system
  • 原文地址:https://www.cnblogs.com/areyouready/p/10217512.html
Copyright © 2011-2022 走看看