Scala之集合归纳

本文详细介绍了Scala的集合系统,包括序列、数组、List、Set、元组、Map和Option。强调了可变与不可变集合的区别,以及集合中常见的操作如map、filter、reduce等。此外,还探讨了集合之间的转换函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Scala之集合归纳

1. 背景

  1. 编程语言设计点
  1. 数据类型
  2. 流程控制
  3. 运算符
  4. 注释
  5. 方法和函数定义
  6. 权限控制
  7. 集合
  8. IO流
  9. 网络编程
  10. 多线程
  1. 集合可以看成是一个箱子,箱子里面很多格子。格子里面盛放一个一个的数据。这些格子可以连续排列,可以无序排列,可以有关联,可以无关联。
    在这里插入图片描述
  2. 所有的编程语言基本都会设计集合,有序集合,无序集合,数组、List、map、set等等。
  3. 整体scala的集合设计和java很相似,不同的是,scala为了更好支持函数式编程,集合的方法更加丰富。毕竟真实企业开发中,流程控制和集合才是应用的最多的,所以scala的集合使用结合自带的函数,可以有非常丰富的功能应用。例如一行代码实现wordcount

2. 序列

2.1 概述

  1. 在集合中,如果存放数据的一个个格子都是有顺序关系的,可以按照特定顺序访问,则可以称之为序列。
  2. 和java的集合设计一样,也是通过划分接口,不过scala中称之为trait。
  3. collection.Seq是一个trait,是所有可变或不可变序列类型的抽象,其子trait collection.mutable.Seq及collection.immutable.Seq分别对应可变和不可变序列。
  4. 在这里插入图片描述
  5. 注意,scala中为了更好做优化,针对集合也做了长度可变和不可变的设计。因为实际代码实现,为了支持集合长度可变,是牺牲了一定性能的。而scala中干脆将可变长度集合与不可变长度集合区分开,这样一部分场景下,使用不可变集合即可,性能更高
  6. 注意,可变与不可变指的是集合长度或者说容积,并不是说集合中元素内容不可更改。还是最开始那个示意图,集合就是一个箱子,箱子中是一个一个的格子。集合可变不可变指的是箱子的容积是否可以增加,而不是说一个一个格子中对应内容是否可以变化。不管可变不可变集合,箱子中一个一个格子对应的内容都是可以发生改变的。

2.2 不可变数组

  • 数组定义
package com.doit.array

object ArrayTest1 {
   

  def main(args: Array[String]): Unit = {
   
    // 不可变数组,数组中元素都是整数int
    val ints: Array[Int] = Array(1, 2,3, 4, 5)

    // 不可变数组,集合中元素各种类型,所以类型是Any。实际生产中一般不这么使用,因为取出元素之后还需要判断类型
    val array: Array[Any] = Array(1, 3l, "errt", true, 'c', 12.13)
  }
}
  • 数组操作
// 不可变数组,数组中元素都是整数int
    val ints: Array[Int] = Array(1, 2,3, 4, 5)

    // 不可变数组,集合中元素各种类型,所以类型是Any。实际生产中一般不这么使用,因为取出元素之后还需要判断类型
    val array: Array[Any] = Array(1, 3l, "errt", true, 'c', 12.13)

    // 取出ints数组中第0个位置元素并打印
    println(ints(0))

    println("分割线===================")

    // 修改ints数组index为3的元素值,修改之前打印,修改之后打印
    println(ints(3))
    ints(3) = 100
    println(ints(3))

    println("分割线===================")

    // 数组遍历 第一种方式
    for(ele <- array) {
   
      println(ele)
    }

    println("分割线===================")

    // 数组遍历 第二种方式
    for(index <- 0 until ints.length) {
   
      println(ints(index))
    }
    println("分割线===================")

    // 数组遍历 第三种方式
    ints.foreach(e=>println(e))
    println("分割线===================")

    // 数组遍历 第四种方式
    ints.map(x=>println(x))
    println("分割线===================")
  • 数组中方法
package com.doit.array

import scala.collection.mutable

object ArrayTest1 {
   

  def main(args: Array[String]): Unit = {
   
    // 不可变数组,数组中元素都是整数int
    val ints: Array[Int] = Array(1, 2,3, 4, 5)

    // 不可变数组,集合中元素各种类型,所以类型是Any。实际生产中一般不这么使用,因为取出元素之后还需要判断类型
    val array: Array[Any] = Array(1, 3l, "errt", true, 'c', 12.13)

    // 取出ints数组中第0个位置元素并打印
    println(ints(0))

    println("分割线===================")

    // 修改ints数组index为3的元素值,修改之前打印,修改之后打印
    println(ints(3))
    ints(3) = 100
    println(ints(3))

    println("分割线===================")

    // 数组遍历 第一种方式
    for(ele <- array) {
   
      println(ele)
    }

    println("分割线===================")

    // 数组遍历 第二种方式
    for(index <- 0 until ints.length) {
   
      println(ints(index))
    }
    println("分割线===================")

    // 数组遍历 第三种方式
    ints.foreach(e=>println(e))
    println("分割线===================")

    // 数组遍历 第四种方式
    ints.map(x=>println(x))
    println("分割线===================")

    // 最小最大值
    println(ints.min)
    println(ints.max)
    println("分割线===================")

    // 数组首个元素 末尾元素
    println(ints.head)
    println(ints.last)
    println("分割线===================")

    // 去掉末尾元素,返回一个新数组
    val tail: Array[Any] = array.tail
    tail.foreach(println)
    println("分割线===================")

    // 将数组变成list集合
    val list: List[Int] = ints.toList
    println(list.size)
    println("分割线===================")

    // 2个数组的差集
    val diff: Array[Int] = ints.diff(Array(3, 4, 5))
    diff.foreach(println)
    println("分割线===================")

    //数组求和,注意这里是数值类型数组
    println(ints.sum)
    println("分割线===================")

    // 数组排序,会得到一个新数组, 默认是升序的
    val array1: Array[Int] = Array(100, 0, 3, -1, 30)
    val sorted: Array[Int] = array1.sorted
    sorted.foreach(println)
    println("分割线===================")

    // 更新一个数组对应index元素的值
    array1.update(2, 987)
    array1.foreach(println)
    println("分割线===================")

    // 数组长度
    println(array1.length)
    println(array1.size)
    println("分割线===================")

    // 取出一个数组前多少元素,返回一个新数组
    val array2: Array[Int] = array1.take(2)
    array2.foreach(println)
    println("分割线===================")

    // 数组后面追加一个元素,返回一个新数组
    val array3: Array[Int] = array2.:+(1000)
    array3.foreach(println)
    println("分割线===================")

    // 统计一个数组中符合要求的元素个数
    val i: Int = array3.count(e => e > 200)
    println(i)
    println("分割线===================")

    // 数组倒置
    val reverse: Array[Int] = array3.reverse
    reverse.foreach(println)
    println("分割线===================")

    // 2个数组拼接,
    val combines: Array[Int] = array3 ++ array2
    combines.foreach(println(_))
    println("分割线===================")

    // 转换为可变数组,注意这里有mutable包名
    val buffer: mutable.Buffer[Int] = array3.toBuffer
  }
}

2.3可变数组

  1. 可变数组,需要导入对应包名,或者直接以全类名进行使用。但全类名使用,类名就太长了。
  2. import scala.collection.mutable.ArrayBuffer 注意,scala中import语句可以放在任何代码使用前的地方,而java规定必须放在代码文件顶部。不过实际生产中,import代码的位置和java一样,这样会规范很多。但如果遇到了代码中有import的代码也不要觉得奇怪。
  3. scala中,数组也是划分了可变长度数组和不可变长度数组。注意是长度不可变!!!!
package com.doit.array

import scala.collection.mutable.ArrayBuffer

object MutableArrayTest1 {
   
  def main(args: Array[String]): Unit = {
   

    val buffer: ArrayBuffer[Int] = ArrayBuffer(1, 2, 3)

    val buffer1: ArrayBuffer[Any] = ArrayBuffer(1, 23.1, true, 'x', "erer")

    // 添加一个元素
    buffer += 78
    buffer.foreach(println)
    println("分割线==========================")

    // 2个数组拼接
    val buffer2: buffer1.type = buffer1 ++= buffer
    buffer2.foreach(println(_))
    println("分割线==========================")

    // 2个数组求差集
    val buffer3: buffer.type = buffer --= Array(2, 3)
    buffer3.foreach(println(_))
    println("分割线==========================")

    // 数组移除index为1的元素
    buffer.remove(1)
    buffer.foreach(println(_))
    println("分割线==========================")

    // 从index0开始,移除2个元素
    buffer1.remove(0, 2)
    buffer1.foreach(println(_))
    println("分割线==========================")

    // 将可变数组变成不可变数组
    val toArray: Array[Any] = buffer1.toArray
    println("分割线==========================")
  }
}

2.4List

2.4.1 不可变List
package com.doit.list

import scala.collection.mutable

object ListTest2 {
   
  def main(args: Array[String]): Unit = {
   

    // 不可变list
    val list = List("java", "c++", "php", "sql", 12, 9527)

    // 像Nil空队列中插入元素组成新队列
    val list1: List[String] = "hive" :: "mysql" :: "hbase" :: Nil

    // Nil和List.empty[Nothing]等价
    val list2 = List.empty[Nothing]
//    println(list2(0)) 数组越界
    println("分割线====================")

    // list追加一个元素,返回一个新的list
    val list3: List[String] = list2 :+ "oracle"
    list3.foreach(println(_))
    println("分割线====================")

    // 2个list拼接
    val list4: List[String] = list2 ++ list3
    list4.foreach(println)
    println("分割线====================")

    // 拿list中前2个,返回一个新list
    val list5: List[String] = list4.take(2)
    list5.foreach(println(_))
    println("分割线====================")

    // 从list右边取3个元素,返回一个新list
    val list6: List[String] = list4.takeRight(3)
    list6.foreach(println)
    println("分割线====================")

    // 遍历每个元素   参数是一个偏函数
    val list7: List[String] = list1.collect({
    case x: String => x })
    list7.foreach(println(_))
    println("分割线====================")

    // 查找
    val maybeString: Option[String] = list1.find(x => x.startsWith("my"))
    maybeString.foreach(println(_))
    println("分割线====================")

    // 是否为空
    println(list1.isEmpty)
    println("分割线====================")

    // 转换为可变数组
    val buffer: mutable.Buffer[String] = list1.toBuffer
    println("分割线====================")
  }
}

2.4.1 可变List
package com.doit.list

import scala
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值