Scala数组、集合、元组

Scala数组、集合、元组

数组与集合的分类

  • Scala中的集合和数组的分类**

    • 可变:mutable
      • 可变指的是元素的值或者长度是可变的
  • 不可变:immutable

    • 不可变的指的是元素的值或者长度是不可变的
    • 推荐使用不可变
    • 工作场景经常需要做可变的集合
  • 实现的时候

    • 初始化:构建一个可变的
    • 处理完成以后:转换为一个不可变的
  • 可变数组和可变集合

  • 可变:mutable,指的是数组或集合中的元素的值可变或者长度可变

  • 在这里插入图片描述

  •   scala.collection.mutable._
    
    • 数组
      scala.collection.mutable.ArrayBuffer
    
  • 集合

      scala.collection.mutable.ListBuffer
      scala.collection.mutable.Map
      scala.collection.mutable.Set
    
  • 不可变数组和不可变集合

    • 不可变:immutable,指的是数组或集合中的元素的值不可变或者长度不可变
    • 在这里插入图片描述
    • scala.collection.immutable._
      
    • 数组

      scala.Array
      
    • 集合

      scala.collection.immutable.List
      scala.collection.immutable.Map
      scala.collection.immutable.Set
      
  • 应用场景

    • Scala中推荐使用不可变类型,所以默认构建的都为不可变类型,如果需要构建可变类型,需要提前手动导包
    • 默认已经导入了所有不可变类型
  • 如果业务中需要使用可变类型,一般最终也转换为不可变类型

数组Array与ArrayBuffer

  • ArrayBuffer与Array的区别

    • Array:数组长度不可变,定长数组
    • ArrayBuffer:数组长度可变,变长数组
  • Array的定义、赋值及取值

    • 定义

      //用于指定数组长度,没有指定初始值,必须加new
      scala> val a1 = new Array[Int](5)
      a1: Array[Int] = Array(0, 0, 0, 0, 0)
      //指定了初始值可以不加new
      scala> val a2 = Array(1,2,3,4,5)
      a2: Array[Int] = Array(1, 2, 3, 4, 5)
      
    • 赋值

      scala> a1(0) = 10
      
      scala> a1
      res1: Array[Int] = Array(10, 0, 0, 0, 0)
      
      • Scala中引用下标使用圆括号

      • 下标从0开始

    • 取值

 scala> a1(0)
res2: Int = 10

scala> println(a1(0))
10

scala> for(i <- a1 ) println(i)
10
0
0
0
0

scala> for(i <- a2 ) println(i)
1
2
3
4
5

scala> for(i <- 0.to(4) ) println(i)
0
1
2
3
4

scala> for(i <- 0.to(4) ) println(a2(i))
1
2
3
4
5

scala> for(i <- 0.to(a2.length - 1) ) println(a2(i))
1
2
3
4
5

scala> for(i <- a2.reverse ) println(i)
5
4
3
2
1

scala> for(i <- (a2.length - 1).to(0) ) println(a2(i))

scala> for(i <- (a2.length - 1).to(0,-1) ) println(a2(i))
5
4
3
2
1

scala> for(i <- (a2.length - 1).to(0,-2) ) println(a2(i))
5
3
1

ArrayBuffer的定义、赋值及取值

  • 定义
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> val ab1 = new ArrayBuffer[Int]()
ab1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer()

scala> val ab2 = ArrayBuffer(1,2,3)
ab2: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

增加:+=、append

scala> ab1 += 10
res13: ab1.type = ArrayBuffer(10)

scala> ab1 += 9
res14: ab1.type = ArrayBuffer(10, 9)

scala> ab1 += 7
res15: ab1.type = ArrayBuffer(10, 9, 7)

scala> ab1.append(8)

scala> ab1
res17: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(10, 9, 7, 8)

scala> a1
res18: Array[Int] = Array(10, 0, 0, 0, 0)

赋值

scala> ab1(1) = 8

scala> ab1
res21: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(10, 8, 7, 8)

取值

scala> for(x <- ab1) println(x)
10
8
7
8

删除:-= 、remove

//按照值进行剔除
scala> ab1 -= 8
res23: ab1.type = ArrayBuffer(10, 7, 8)

//按照下标剔除
scala> ab1.remove(1)
res24: Int = 7

scala> ab1
res25: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(10, 8)

数组中的常用操作

  • 排序:sorted
scala> ab2.sorted
res31: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 3, 5, 7, 10)

反转:reverse

scala> ab2.sorted.reverse
  res32: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(10, 7, 5, 3, 3, 2, 1)

求和:sum

scala> ab2.sum
res33: Int = 31

最大:max

scala> ab2.max
res34: Int = 10

最小:min

scala> ab2.min
res35: Int = 1

转换为字符串:mkString

scala> ab2.mkString
                       def mkString(sep: String): String                             
def mkString: String   def mkString(start: String,sep: String,end: String): String   

scala> ab2.mkString
res38: String = 12373510

scala> ab2.mkString("-")
res39: String = 1-2-3-7-3-5-10

scala> ab2.mkString(",")
res40: String = 1,2,3,7,3,5,10

scala> ab2.mkString("<",",",">")
res41: String = <1,2,3,7,3,5,10>

scala> ab2.mkString("<","-",">")
res42: String = <1-2-3-7-3-5-10>

列表List与ListBuffer

    • List集合的特点
  • 有序可重复的集合

    • List与ListBuffer的区别

      • List:不可变的集合,长度和元素值都不可变
      • ListBuffer:可变的集合,长度和元素值都可变
    • List的定义、赋值及取值

    • 定义

      scala> val list1 = List(1,2,3,4,5,6,6,1,2)
      list1: List[Int] = List(1, 2, 3, 4, 5, 6, 6, 1, 2)
      
      scala> list1(0) = 10
      <console>:14: error: value update is not a member of List[Int]
             list1(0) = 10
             ^
      
      • 值不可改变

      • 取值

        scala> list1(0)
        res44: Int = 1
        
        scala> for(i <- list1) println(i)
        1
        2
        3
        4
        5
        6
        6
        1
        2
        
    • ListBuffer的定义、赋值及取值

      • 定义

        scala> val listb1 = new ListBuffer[Int]()
        listb1: scala.collection.mutable.ListBuffer[Int] = ListBuffer()
        
        scala> val listb2 = ListBuffer(1,2,3,4,3,2,1)
        listb2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 3, 2, 1)
        
      • 添加:+=、append

        scala> listb1 += 1
        res52: listb1.type = ListBuffer(10, 9, 8, 1)
        
        scala> listb1.append(3)
        
        scala> listb1
        res57: scala.collection.mutable.ListBuffer[Int] = ListBuffer(10, 2, 8, 1, 3)
        
      • 赋值

        scala> listb1(1) = 2
        
        scala> listb1
        res55: scala.collection.mutable.ListBuffer[Int] = ListBuffer(10, 2, 8, 1)
        
      • 删除:-=、remove

        scala> listb1 -= 10
        res58: listb1.type = ListBuffer(2, 8, 1, 3)
        
        scala> listb1.remove(0)
        res59: Int = 2
        
        scala> listb1
        res60: scala.collection.mutable.ListBuffer[Int] = ListBuffer(8, 1, 3)
        
        
      • 取值

        scala> listb1(0)
        res61: Int = 8
        
        scala> for(x <- listb1) println(x)
        8
        1
        3
        

List于ListBuffer的常用操作

  • List集合常用操作

    • 取第1个元素:head

      scala> list1.head
      res64: Int = 1
      
    • 取除了第一个元素以外的元素:tail

      scala> list1.tail
      res65: List[Int] = List(2, 3, 4, 5, 6, 6, 1, 2)
      
    • 取前N个元素:take

      scala> list1.take(3)
      res66: List[Int] = List(1, 2, 3)
      
    • 取除了前N个元素以外的所有元素:drop

      scala> list1.drop(3)
      res67: List[Int] = List(4, 5, 6, 6, 1, 2)
      
    • 定义一个空list集合:Nil

      scala> val list2 = Nil
      list2: scala.collection.immutable.Nil.type = List()
      
      • 一般不用于存储数据,一般用于拼接元素构建集合
    • 集合头部添加元素返回新的集合:+:、::

      scala> list1.+:(10)
      res69: List[Int] = List(10, 1, 2, 3, 4, 5, 6, 6, 1, 2)
      
      scala> list1
      res70: List[Int] = List(1, 2, 3, 4, 5, 6, 6, 1, 2)
      
      scala> 9::list1
      res71: List[Int] = List(9, 1, 2, 3, 4, 5, 6, 6, 1, 2)
      
    • 集合尾部添加元素返回新的集合::+

      scala> list1.:+(10)
      res72: List[Int] = List(1, 2, 3, 4, 5, 6, 6, 1, 2, 10)
      
    • 拼接两个集合的元素返回新的集合:++、:::

      scala> list3:::list4
      res73: List[Int] = List(1, 2, 3, 4, 3, 4, 5, 6)
      
      scala> list4:::list3
      res74: List[Int] = List(3, 4, 5, 6, 1, 2, 3, 4)
      
      scala> list3 ++ list4
      res75: List[Int] = List(1, 2, 3, 4, 3, 4, 5, 6)
      
      scala> list4 ++ list3
      res76: List[Int] = List(3, 4, 5, 6, 1, 2, 3, 4)
      
    • 扁平化操作:将两层集合转换为一层集合:flatten

      scala> val list5 = List(List(1,2),List(3,4),List(5,6))
      list5: List[List[Int]] = List(List(1, 2), List(3, 4), List(5, 6))
      
      scala> for(x <- list5) println(x)
      List(1, 2)
      List(3, 4)
      List(5, 6)
      
      scala> list5.flat
      flatMap   flatten
      
      scala> list5.flatten
      res78: List[Int] = List(1, 2, 3, 4, 5, 6)
      
    • 拉链操作:zip、zipWithIndex

      scala> val list6 = List(1,2,3,4)
      list6: List[Int] = List(1, 2, 3, 4)
      
      scala> val list7 = List("a","b","c","d")
      list7: List[String] = List(a, b, c, d)
      
      scala> list6.zip(list7)
      res79: List[(Int, String)] = List((1,a), (2,b), (3,c), (4,d))
      
      scala> list7.zipWithIndex
      res80: List[(String, Int)] = List((a,0), (b,1), (c,2), (d,3))
      
      • 一般用于将List集合转换为Map集合
    • 拉开操作:unzip

      scala> val list8 = list6.zip(list7)
      list8: List[(Int, String)] = List((1,a), (2,b), (3,c), (4,d))
      
      scala> list8.unzip
      res81: (List[Int], List[String]) = (List(1, 2, 3, 4),List(a, b, c, d))
      
      scala> val list9 = list8.unzip
      list9: (List[Int], List[String]) = (List(1, 2, 3, 4),List(a, b, c, d))
      
      scala> list9._1
      res82: List[Int] = List(1, 2, 3, 4)
      
      scala> list9._2
      res83: List[String] = List(a, b, c, d)
      
    • 并集:union

      scala> list3.union(list4)
      res86: List[Int] = List(1, 2, 3, 4, 3, 4, 5, 6)
      
      
    • 交集:intersect

      scala> list3.intersect(list4)
      res87: List[Int] = List(3, 4)
      
    • 差集:diff

      scala> list3.diff(list4)
      res88: List[Int] = List(1, 2)
      
      scala> list4.diff(list3)
      res89: List[Int] = List(5, 6)
      
  • ListBuffer集合常用操作

    scala> listb1.to
    to        toBuffer       toIterable   toList   toParArray   toSet      toString        toVector   
    toArray   toIndexedSeq   toIterator   toMap    toSeq        toStream   toTraversable   
    
    • 转换为List:toList

      scala> listb1.toList
      res91: List[Int] = List(8, 1, 3)
      
    • 转换为Array:toArray

      scala> listb1.toArray
      res92: Array[Int] = Array(8, 1, 3)
      

Set集合

- **Set集合的特点**
  • 无序不重复集合,一般用于实现数据的去重功能

  • 可变Set集合与不可变Set的区别

    • immutable.Set:不可变Set集合,长度不可变
    • mutable.Set:可变Set集合,长度可变
  • 不可变Set集合的定义与读取

    • 定义

      scala> val set1 = Set(1,2,3,4,4,2,1,3)
      set1: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 4)
      
    • 取值

      scala> for(i <- set1 ) println(i)
      1
      2
      3
      4
      
    • 获取集合长度:size

      scala> set1.size
      res100: Int = 4
      
  • 可变Set集合的定义、赋值与读取

    • 定义

      scala> import scala.collection.mutable.Set
      import scala.collection.mutable.Set
      
      scala> val set2 = Set(1,2,3,4,4,2,1,3)
      set2: scala.collection.mutable.Set[Int] = Set(1, 2, 3, 4)
      
    • 添加:+=

      scala> set2 += 4
      res102: set2.type = Set(1, 5, 2, 3, 4)
      
      
      
    • 删除:-=

      scala> set2 -= 2
      res103: set2.type = Set(1, 5, 3, 4)
      
    • 读取

      scala> for(i <- set2) println(i)
      1
      5
      3
      4
      

Map集合

  • Map集合的特点

    • 存储KeyValue格式数据的集合
    • 作为大数据工程师:处理最多的数据结构类型:KV结构类型
  • 可变Map与不可变Map的区别

    • immutable.Map:不可变Map,不可添加、删除、更新元素
    • mutable.Map:可变Map,可以添加、删除、更新元素
  • 不可变Map集合的定义、读取

    • 定义

      scala> val map1 = Map("name" -> "laoda","age" -> "20","gender"->"male")
      map1: scala.collection.immutable.Map[String,String] = Map(name -> laoda, age -> 20, gender -> male)
      
      scala> val map2 = Map(("name","laoer"),("age","22"),("gender","female"))
      map2: scala.collection.immutable.Map[String,String] = Map(name -> laoer, age -> 22, gender -> female)
      
    • 读取

      • 方式一:直接根据Key读取

        scala> map1("name")
        res105: String = laoda
        
        scala> map1("name1")
        java.util.NoSuchElementException: key not found: name1
          at scala.collection.MapLike$class.default(MapLike.scala:228)
          at scala.collection.AbstractMap.default(Map.scala:59)
          at scala.collection.MapLike$class.apply(MapLike.scala:141)
          at scala.collection.AbstractMap.apply(Map.scala:59)
          ... 32 elided
        
        • 一般不用,如果key不存在,会报错
      • 方式二:使用get方法

        scala> map1.get
           def get(key: String): Option[String]
        
        scala> map1.get("name")
        res107: Option[String] = Some(laoda)
        
        scala> map1.get("name").get
        res108: String = laoda
        
        scala> map1.get("name1")
        res109: Option[String] = None
        
      • 方式三:使用getOrElse方法

        scala> map1.getOrElse("name1","null")
        res112: String = null
        
        scala> map1.getOrElse("name","null")
        res113: String = laoda
        
      • 方式四:循环挨个取值

        scala> for(x <- map1) println(x)
        (name,laoda)
        (age,20)
        (gender,male)
        
        scala> for((key,value) <- map1) println(key+"\t"+value)
        name    laoda
        age     20
        gender  male
        
  • 可变Map集合的定义、添加、读取

    • 定义

      scala> import scala.collection.mutable.Map
      import scala.collection.mutable.Map
      
      scala> val map3 = Map(("name","laoer"),("age","22"),("gender","female"))
      map3: scala.collection.mutable.Map[String,String] = Map(age -> 22, name -> laoer, gender -> female)
      
    • 添加:+=

      scala> map3 += "addr" -> "shanghai"
      res116: map3.type = Map(addr -> shanghai, age -> 22, name -> laoer, gender -> female)
      
    • 更新:=

      scala> map3("addr") = "beijing"
      
      scala> map3
      res120: scala.collection.mutable.Map[String,String] = Map(addr -> beijing, age -> 22, gender -> female)
      
    • 删除:remove

      scala> map3.remove("name")
      res117: Option[String] = Some(laoer)
      
      scala> map3
      res118: scala.collection.mutable.Map[String,String] = Map(addr -> shanghai, age -> 22, gender -> female)
      
    • 获取Key:keys

      scala> map3.keys
      res121: Iterable[String] = Set(addr, age, gender)
      
    • 获取Value:values

      scala> map3.values
      res122: Iterable[String] = HashMap(beijing, 22, female)
      
    • 遍历

      for(x <- map3) println(x)
      for((key,value)<- map3) println(key+"\t"+value)
      for(key <- map3.keys) println(map3(key))
      

元组Tuple

  • 元组的功能和特点

    • 功能:类似于数组,用于存储不同类型的元素的集合
    • 区别
      • 数组:数组中只能存储一种类型的元素
      • 元组:元组中可以存储不同类型的元素
  • 元组的语法

    val/var tupleName = (元素1,元素2,元素3,元素4……)
    val/var tupleName = TupleN(元素1,元素2,元素3,元素4……元素N)
    
    • 举例

      scala> val tuple1 = (1,2,"itcast",14.9,true)
      tuple1: (Int, Int, String, Double, Boolean) = (1,2,itcast,14.9,true)
      
      scala> val tuple2 = new Tuple3(1,2,"heima")
      tuple2: (Int, Int, String) = (1,2,heima)
      
    • 特殊:二元组就是KeyValue对

    • 方法:swap:二元组特有的方法

      • 将key和value的位置互换
    • 元组最多只能有22个元素

  • 元组的取值

    • 通过tuple._N来引用元组中的元素(N从1开始)

    • 举例

      scala> tuple1._1
      res126: Int = 1
      
      scala> tuple1._2
      res127: Int = 2
      
      scala> tuple1._3
      res128: String = itcast
      

迭代器Iterator

- scala针对每一类集合都提供了一个迭代器(iterator)用来迭代访问集合
  • 迭代器的两个基本方法

    • hasNext:查询容器中是否有下一个元素
    • next:返回迭代器的下一个元素,如果没有,抛出NoSuchElementException
  • 举例

    scala> val array = Array(1,2,3,4,5)
    array: Array[Int] = Array(1, 2, 3, 4, 5)
    
    scala> val itera = array.iterator
    itera: Iterator[Int] = non-empty iterator
    
    scala> while(itera.hasNext) println(itera.next)
    1
    2
    3
    4
    5
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值