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}")
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue Cli 脚手架目录文件介绍

小试牛刀 //vetur高亮; vuetab 快速生成 <template><div class"box">我是个盒子<button click"fn">按钮</button></div> </template><script> export default {methods:{fn(){alert("Hello Vue")}} …

基于springboot的家装平台设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Docker平台搭建方法

Docker平台搭建方法 1.1在VMware中创建两个虚拟机&#xff0c;只需要1个网卡&#xff0c;连接192.168.200.0网络。 虚拟机分配2个CPU,2G内存&#xff0c;60G硬盘&#xff0c;主机名分别为server和client,IP地址分别为192.168.200.137和192.168.200.138。server节点还兼做regis…

cache(二)直接缓存映射

在知乎发现一份不错得学习资料 请教CPU的cache中关于line,block,index等的理解&#xff1f; PPT 地址 https%3A//cs.slu.edu/%7Efritts/CSCI224_S15/schedule/chap6-cache-memory.pptx 课程主页 https://cs.slu.edu/~fritts/CSCI224_S15/schedule/ 0. 缓存定义 这张图展示了缓…

Zookeeper的安装与使用

一、简介 1.1、概念 ZooKeeper 是一个开源的分布式协调服务&#xff0c;主要用于解决分布式系统中的数据一致性问题。它提供了一种可靠的机制来管理和协调分布式系统的各个节点。ZooKeeper 的设计目标是简化分布式应用的开发&#xff0c;提供简单易用的接口和高性能、高稳定性…

SQLI LABS | Less-41 GET-BLIND Based-Intiger-Stacked

关注这个靶场的其它相关笔记&#xff1a;SQLI LABS —— 靶场笔记合集-CSDN博客 0x01&#xff1a;过关流程 输入下面的链接进入靶场&#xff08;如果你的地址和我不一样&#xff0c;按照你本地的环境来&#xff09;&#xff1a; http://localhost/sqli-labs/Less-41/ 本关是堆…

SpringCloud 微服务消息队列灰度方案 (RocketMQ 4.x)

目录 背景遇到的问题 RocketMQ 基础基础消息模型扩展后的消息模型部署模型相关概念点 方案对比影子Topic的方案Tag的方案UserProperty的方案影子Group的方案灰度分区的方案方案对比 灰度分区方案设计适配只有部分灰度的情况所做的功能扩展消费者&#xff08;无灰度&#xff09;…

Simulink对仿真数据进行FFT频谱分析

1 问题引入 在仿真阶段&#xff0c;经常会遇到有些仿真结果的数据需要进行频谱分析&#xff0c;如何快速便捷地操作&#xff0c;这里介绍其中一种简单的方法。主要利用 Simulink 中 Scope 显示的数据进行保存并进行 FFT 频谱分析&#xff0c;按下文操作即可。 2 实战 2.1 将…

Vue前端开发:gsap动画库

gsap它的全称是GreenSock Animation Platform&#xff0c;它是一个功能非常强大的动画平台&#xff0c;它可以对JavaScript操作的所有内容实现动画效果&#xff0c;同时&#xff0c;还解决了不同浏览器中存在的兼容性问题&#xff0c;而且速度和效率都非常快&#xff0c;全球超…

【layui】echart的简单使用

图表类型切换&#xff08;柱形图和折线图相互切换&#xff09; <title>会员数据</title><div class"layui-card layadmin-header"><div class"layui-breadcrumb" lay-filter"breadcrumb"><a lay-href""&g…

[Redis] Redis缓存机制

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

绘制3D图

一个 3D 函数的表面图&#xff0c;其中包含向量场。 Python 代码示例&#xff0c;使用 matplotlib 和 numpy 库来绘制类似的图。 python 复制代码 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D# 生成网格 x np.linspace(-…

【开源免费】基于SpringBoot+Vue.JS课程答疑系统(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 070 &#xff0c;文末自助获取源码 \color{red}{T070&#xff0c;文末自助获取源码} T070&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

C#开发流程

注&#xff1a;检查数据库链接 设置搜索 1.新建模块文件夹 对应应用 右键-添加-新建文件夹 2.新建类 在新建模块下右键 新建-类&#xff0c;修改类名称 修改internal为public 新建所需字段&#xff0c;注意类型声明及必填设置 [SugarColumn(IsNullable false)]public strin…

【Transformer】模型输出模块处理

目录 输出处理模块步骤1. 交叉注意力后的输出向量2. 线性变换&#xff08;投影&#xff09;3. Softmax 操作4. 选择最大概率的单词5. 输出词并进入下一轮预测总结&#xff1a; 线性变换详解1. 交叉注意力后的输出向量2. 线性层的参数3. 线性变换的计算4. Softmax 转换为概率示例…

对话流式数据加载

需求&#xff1a;根据接口返回的数据进行类似打字机渲染的效果 使用的fetch 流式处理 fetch(BASE_URL/api/apps/ this.app_Id /chat-messages, {signal: this.controller.signal,method: POST,headers: {Authorization: Bearer localStorage.getItem(token),Content-Type: …

关于git使用的图文教程(包括基本使用,处理冲突问题等等)超详细

目录 用户签名,初始化git git提交流程图 提交到本地库 版本穿梭 分支操作 分支合并冲突 团队协作 github的使用 推送代码 克隆 拉取代码 团队协作冲突 团队协作之分支管理 推送分支到分支&#xff1a; 拉去远程库分支到本地库&#xff1a; 本地删除远程分支&am…

6、If、While、For、Switch

6、If、While、For、Switch 一、If 1、if-else if (boolean) {代码块 } else if (boolean) {代码块 } else if (boolean) {代码块 } else { // 默认情况代码块 }关于IDEA单元测试控制台不能输入数据的问题&#xff1a; https://blog.csdn.net/m0_72900498/article/details/…

【智谱开放平台-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

贪心算法day05(k次取反后最大数组和 田径赛马)

目录 1.k次取反后最大化的数组和 2.按身高排序 3.优势洗牌 1.k次取反后最大化的数组和 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 代码&#xff1a; class Solution {public int largestSumAfterKNegations(int[] nums, int k) {//如…