当前位置: 首页 > article >正文

Scala 的Set集合

  Scala的Set (集合)是没有重复的对象集合,所有元素都是唯一的。Scala的集合分为可变的和不可变的两种。默认情况下,scala使用的是不可变集合,如果想使用可变集合,需引用scala.collection.mutable.Set包,默认引用scala.collection.immutable.Set包。

1.1 Scala的Set继承关系

  Scala为Set中的每一个集合几乎都提供了两个版本,分别是可变的版本和不可变的版本。 Scala的Set继承关系如图8-1所示。BitSet是一个字节集合,主要存储非负的整数,可以提高内存空间的使用率。HashSet基于HashTable实现可变版本,基于HashTrie实现不可变版本。ListSet只有不可变版本,基于链表实现不可变版本。ListSet对应的可变版本是LinkedhashSet,用于保证集合的插入顺序。TreeSet基于树实现不可变版本,基于AVL树实现可变版本。Sortedset是有排序功能的Set, 它基于红黑树实现不可变版本,基于有序二叉树实现可变版本。

  对于BitSet、HashSet,、ListSet等集合只是底层实现不同,大部分操作都与Set相同,可以直接使用。 考虑到性能问题,会根据不同的应用场景选择不同的Set集合。

1.2 Scala的Set概述

  下面主要通过Set集合的可变版本和不可变版本的通用方法介绍Set集合的特点和常用操作,通过集合的增加、删除、修改、查询、排序等操作进一步了解Set集合的应用,再结合案例加深对Set集合操作的理解。

1.Scala的Set定义

  Scala的Set分为可变的和不可变的,默认情况下使用不可变的集合。如果想要使用可变的集合, 需要导入指定的包。Set集合的特点是无序不重复。当在Set集合中添加元素时,没有重复的元素,并且不保证顺序。如果集合中有重复的元素,Set集合会自动去掉重复元素,Set集合在调用apply方法时会对元素进行判断。

相关代码如下:

//set

object Test_24 {
  def main(args: Array[String]): Unit = {
    //1.定义set
//    val set1 = Set[元素的类型](元素1,元素2,....)
    //元素的类型可以省略

//    val set1 = Set[String]("小花","小明","小明")
    val set1 = Set("小花","小明","小明")
    println(set1)
  }
}

2.Scala的常用操作

  Scala的常用操作如表8-1所示。条件操作主要是判断元素是否在集合中,例如使用Contains方法判断集合中是否包含某一个元素,如果存在,则返回true,否则返回false。另外,可以通过加法或减法操作向集合中添加或移除元素,这种集合操作在之前已经有所介绍。一般情况下,对于不可变集合, 使用+方式添加单个或多个元素,使用++方式添加集合,这种操作是父类的通用方法。

  可变集合与不可变集合各有一套通用方法。对于可变集合,使用+=方式添加单个或多个元素, 使用++=方式添加集合。与添加元素或集合相对应的是移除元素或集合,可以使用-=和--=以及remove等方式移除元素。remove 可以用于删除指定的元素,例如remove(x)表示删除x元素。对于不可变集合,它的元素是不可以进行更新操作的,只有可变集合才可以进行元素的更新,使用集合调用update方法可以直接更新元素。

  二元逻辑操作就是通过交集、并集和差集对集合进行操作。假设有两个集合Setl和Set2,它们的元素分别为(1,2,3)和(2,3,4)。如果对这两个集合取交集,则返回(2,3);如果取并集,则返回(1,2,3,4), 由于不可以有重复元素,所以会把重复元素去掉;如果取差集,则返回(1)。

下面举例说明Set集合的常用操作,相关代码如下:

import scala.collection.mutable
object Test_24 {
  def main(args: Array[String]): Unit = {
    //不可变Set. 默认使用的set就是不可变的!
//    val course = Set("语文","数学")
//    //1.添加
//    val course1 = course + "英语"
//    //2.删除
//    val course2 = course - "英语"
//    println(course2)

//    可变set,需要额外去引入包
    val course = mutable.Set("语文","数学")
    println(course)
    //2.添加
    course  += "英语"
    course  += "英语"
    course  += "英语"
    course  += "英语"
    course  += "英语"

    //3.删除
    course -= "语文"

    //4.添加一个set
    course ++= mutable.Set("体育","音乐")
    println(course)

    //5.查询 元素是否存在。 contains
    val rs = course.contains("体育1")
    // rs 是 ture,false。是Boolean格式。
    println(s"体育是否存在:${rs}")
  }
}

小练习:

object Test_24 {
  def main(args: Array[String]): Unit = {
    //集合操作

    val xiaohua = mutable.Set("语文","数学","英语")
    val xiaoming = mutable.Set("语文","体育","音乐")
//    问题1:他们一共选了哪些课?       "语文","数学","英语","体育","音乐"
      val rs2 = xiaohua.union(xiaoming)
      println(s"他们一共选了哪些课?${rs2}")
//    问题2:哪些课是小花选了,小明没有选?   "数学","英语"
      //差集
      val rs3 = xiaohua.diff(xiaoming)
      println(s"哪些课是小花选了,小明没有选?${rs3}")
//    问题3:哪些课是他们都选了的?     "语文"
      //交集
      val rs1 = xiaohua.intersect(xiaoming)
      println(s"哪些课是他们都选了的?${rs1}")
  }
}

http://www.kler.cn/a/394126.html

相关文章:

  • 信号-3-信号处理
  • C++单例模式与多例模式
  • Spring Boot中的自动装配机制
  • jmeter介绍、使用方法、性能测试、现参数化和数据驱动、分布式测试、压力测试、接口测试
  • Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
  • 编写红绿起爆线指标(附带源码下载)
  • 《青牛科技 GC6125:驱动芯片中的璀璨之星,点亮 IPcamera 和云台控制(替代 BU24025/ROHM)》
  • GPT o1 模型使用及API调用
  • 如何绑定洛谷账号
  • 计算机视觉 ---常见图像文件格式及其特点
  • 均值方差增量计算
  • Java EE 技术基础知识体系梳理
  • 数据分析丨世界杯冠军猜想:EA 体育游戏模拟能成功预测吗?
  • i春秋-EXEC(命令执行、nc传输文件、带外通道传输数据)
  • JavaScript中统计每个字符出现的个数(使用reduce方法)
  • unity单例模式的不同声明(待完善
  • 【C语言】从3x5矩阵计算前三行平均值并扩展到4x5矩阵
  • 为什么hbase在大数据领域渐渐消失
  • 速盾:cdn 支持 php 吗?
  • 如何保障医院内部的隔离网安全跨网文件交换?
  • PyTorch深度学习与企业级项目实战-预训练语言模型GPT
  • 探索AutoDL与CodeWithGPU:深度学习之旅的新起点
  • 【python】机器学习调参与自动化:使用Hyperopt优化你的模型
  • Microsoft Fabric - 尝试一下Real time event stream
  • 标贝科技:AI基础数据服务,人工智能行业发展的底层支撑
  • 【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用