Scala数组和集合

Posted areyouready

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 




以上是关于Scala数组和集合的主要内容,如果未能解决你的问题,请参考以下文章

scala集合

Scala数组和集合

Scala 2.13:返回相同的集合类型(甚至数组和字符串)

scala入门系列--数组

Scala如何将集合中的元素放入数组函数中

Scala集合