Scala008--Scala中的数据结构【集合】

news2025/2/28 10:47:31

目录

一,概述

二,set的声明

1,不可变set集合

1)向不可变集合中添加元素    + 【需要新的set集合接收】

2)对两个set集合进行合并   ++   【需要新的set集合接收】

2,不可变的HashSet集合

2,可变HashSet集合

1)可变HashSet集合常用函数

①使用+=函数向集合中添加元素

②使用-=函数从集合中删除元素

③使用add函数向集合中添加元素

③使用remove函数从集合中删除元素

④使用 ++=函数将两个同类序列进行拼接 

⑤使用  --=函数将两个同类序列进行拼接

三,set集合的通用函数

1,查看集合中的元素个数    size

 2,获取set集合中的第一个元素   head

 3,获取set集合中除第一个之外的其他元素    tail


一,概述

set集合有两个显著的特点:①无序;②去重【元素不重复】

set集合也分为可变和不可变两种,并且set集合还有一种特殊的集合HashSet。

在Java中set集合其实就是个接口,它本身不能直接new创建出来一个set集合对象,而是得使用其下的子类,来实例化一个集合对象。如:HashSet,SortedSet等,这篇文章中我们就只了解Scala中的Set和HashSet集合。

二,set的声明

1,不可变set集合

格式:val/var  变量名 =Set(x1,x2,....)

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

对于不可变的set来说,我们对它的任何操作都不会生效。只能使用一个新的set集合进行接收。

如向set集合中添加元素的+函数,两个set集合进行拼接的函数++等都不会对原集合产生影响。

1)向不可变集合中添加元素    + 【需要新的set集合接收】

scala> set1
res9: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set1 + 5
res10: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)

scala> set1
res11: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

 能够添加一个元素,也就可以添加多个元素,如下,我们向set1集合中添加7,8,9三个元素:

scala> set1
res11: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set1 + (7,8,9)
res12: scala.collection.immutable.Set[Int] = Set(1, 9, 2, 7, 3, 8)

scala> set1
res13: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

2)对两个set集合进行合并   ++   【需要新的set集合接收】

使用++函数并不会对原来的set集合产生任何影响,如果想要使用合并后的set集合结果的话可以使用一个变量就行存储。

scala> val set2 =Set(10,11,12)
set2: scala.collection.immutable.Set[Int] = Set(10, 11, 12)

scala> set1
res14: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set2
res15: scala.collection.immutable.Set[Int] = Set(10, 11, 12)

scala> set1 ++ set2
res16: scala.collection.immutable.Set[Int] = Set(10, 1, 2, 12, 3, 11)

scala> set1
res17: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

2,不可变的HashSet集合

在学习Java的时候相信大家还有点印象,就是set集合其实是一个接口,我们不直接使用Set类new实例化一个集合对象,而是使用它的实现类来创建对象,HashSet集合就是Set集合接口下的其中一个实现类。它的使用和Set集合一样,但是在声明的时候,我们需要导入相关的包:

import scala.collection.immutable.HashSet

scala> import scala.collection.immutable.HashSet   // 导入创建不可变hashset集合所需要的包
import scala.collection.immutable.HashSet

scala> val  set_hashset=HashSet(1,2,3)
set_hashset: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)   // 创建不可变的hashset集合

 之后我们像Set集合那样向HashSet集合中添加元素或者是对两个hashset集合进行拼接,效果都会和set集合一样: 

scala> set_hashset
res3: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)

scala> set_hashset + 10 // 向hashset集合中添加一个元素10
res4: scala.collection.immutable.HashSet[Int] = Set(10, 1, 2, 3)

scala> set_hashset //
res5: scala.collection.immutable.HashSet[Int] = Set(1, 2, 3)

唯一不同的就是HashSet可以位于两种不同的包下,一个是immutable(不易变)包下为不可变的hashset集合,另外一个是在mutable(易变)包下为可变的hashset集合。我们需要的就是这个位于易变包mutable下的HashSet集合。接下来我们去进一步了解可变的HashSet集合。

2,可变HashSet集合

需要注意的是,如果我们之前已经导入了一个位于不易变包下的不可变HashSet,再去导入易变包下的可变HashSet集合,并想要创建一个可变的HashSet集合,那么这个时候就会报错【当我在cmd命令行中运行这些代码的时候没有报错】

scala> import scala.collection.immutable.HashSet
import scala.collection.immutable.HashSet

scala> import scala.collection.mutable.HashSet
import scala.collection.mutable.HashSet

scala> val set_hashset=HashSet(1,2,3)  // 默认使用可变的HashSet来创建集合
set_hashset: scala.collection.mutable.HashSet[Int] = Set(1, 2, 3)

scala> val set_hashset1=new HashSet[Int] // 动态创建HashSet集合,程序并不知道我们使用的是可变还是不可变的HashSet
set_hashset1: scala.collection.mutable.HashSet[Int] = Set()

scala>

这个时候我们就需要使用到idea:

/**
 * @author:码到成龚
 * my motoo:"听闻少年二字,应与平庸相斥。"
 */
import  scala.collection.immutable.HashSet  // 导入不可变的hashset
import  scala.collection.mutable.HashSet    // 导入可变的hashset
object TestSet1 {
    // 测试HashSet集合
    def main(args: Array[String]): Unit = {
      val set_hashset=HashSet(1,2,3)  // 静态创建一个hashset集合
      val set_hashset1=new HashSet[Int] //  动态创建一个hashset集合
    }
}

 如上,我们可以发现,在idea上如果同时导入了mutable包和immutable包时,去使用new实例化hashset集合,我们的idea编译器就会直接报错,这种在运行前就报错称为编译时异常。

 因为程序并不知道我们使用的HashSet用得是mutable包下的,还是immutable包下的。所以我们在导入的时候还得需要对导入的HashSet进行起别名操作:

/**
 * @author:码到成龚
 * my motoo:"听闻少年二字,应与平庸相斥。"
 */
import  scala.collection.immutable.{HashSet  => HashSetIm}  // 导入不可变的hashset,并起别名
import  scala.collection.mutable.HashSet    // 导入可变的hashset
object TestSet1 {
    // 测试HashSet集合
    def main(args: Array[String]): Unit = {
      val set_hashset=HashSet(1,2,3)  // 静态创建一个hashset集合
      val set_hashset1=new HashSet[Int] //  动态创建一个hashset集合
    }
}

 如上,我们再去创建hashset集合时就不会有报错。

1)可变HashSet集合常用函数

①使用+=函数向集合中添加元素

可变hashset集合使用+=函数能够直接改变该集合的元素的组成:在hashset集合中的元素位置为hashset集合的长度都会改变,如下:

scala> set_hashset   // 动态创建的hashset集合
res0: scala.collection.mutable.HashSet[Int] = Set(1, 2, 3)

scala> set_hashset1     //  静态创建的hashset集合
res1: scala.collection.mutable.HashSet[Int] = Set()

scala> set_hashset+=(7,8,9)    // 向hashset集合中添加元素
res2: set_hashset.type = Set(9, 1, 2, 3, 7, 8)

scala> set_hashset1+=(7,8,9)   
res3: set_hashset1.type = Set(9, 7, 8)

scala> set_hashset         //  查看添加元素之后的hashset集合中元素是否有增多
res4: scala.collection.mutable.HashSet[Int] = Set(9, 1, 2, 3, 7, 8)

scala> set_hashset1
res5: scala.collection.mutable.HashSet[Int] = Set(9, 7, 8)

②使用-=函数从集合中删除元素

-=函数和+=函数类似:

scala> set_hashset1    // 修改前的hashset集合
res5: scala.collection.mutable.HashSet[Int] = Set(9, 7, 8)

scala> set_hashset1 -=(8,9)  // 从hashset集合中删除两个元素8和9
res6: set_hashset1.type = Set(7)

scala> set_hashset1    // 修改之后的hashset集合
res7: scala.collection.mutable.HashSet[Int] = Set(7)

③使用add函数向集合中添加元素

add函数不像可变数组,可变列表那样的append函数可以一次性加入多个元素,也没有insert函数可以使用,但是就set集合本身来说它的特点:不可重复,在我们编写代码的过程中有很大的作用。add函数不管添加成功与否,返回的结果只有true或false,表示添加成功或者是失败:

scala> set_hashset1     
res10: scala.collection.mutable.HashSet[Int] = Set(7, 4)

scala> set_hashset1.add(10)  // add函数一次性只能够添加一个元素
res11: Boolean = true        //  add函数只会返回两种值,true或者是false,添加成功为true,反之false

scala> set_hashset1
res12: scala.collection.mutable.HashSet[Int] = Set(10, 7, 4)

③使用remove函数从集合中删除元素

因为set集合是没有索引的,所以我们在使用remove函数对集合中的元素进行删除处理的时候不能向remove函数中传入索引,而是指定的单个元素值:

scala> set_hashset1 
res12: scala.collection.mutable.HashSet[Int] = Set(10, 7, 4)

scala> set_hashset1.remove(10)   //  该函数只能够删除一个元素(指定的元素值)
res13: Boolean = true            //  remove函数和add函数一样只能返回两种结果

scala> set_hashset1
res14: scala.collection.mutable.HashSet[Int] = Set(7, 4)

④使用 ++=函数将两个同类序列进行拼接 

++=和+=函数的作用一样,都是向集合中添加元素,但是++=函数可以用于同类序列之间的拼接,而+=函数是无法实现的:

scala> val set_set=Set(66,77,88)   //  创建一个不可变set集合
set_set: scala.collection.immutable.Set[Int] = Set(66, 77, 88)

scala> set_hashset1     // 查看可变hashset集合中的元素
res16: scala.collection.mutable.HashSet[Int] = Set(7, 4)

scala> set_hashset1 ++= set_set    // 将两个集合进行拼接
res17: set_hashset1.type = Set(66, 88, 7, 4, 77)

scala> set_hashset1    // 查看拼接后的集合
res18: scala.collection.mutable.HashSet[Int] = Set(66, 88, 7, 4, 77)

⑤使用  --=函数将两个同类序列进行拼接

--=和++=函数类似:

scala> set_hashset1    // 修改之前的hashset集合
res19: scala.collection.mutable.HashSet[Int] = Set(66, 88, 7, 4, 77)

scala> set_hashset1  --= set_set  // set_hashset1集合中减掉set_set集合中的元素
res20: set_hashset1.type = Set(7, 4)

scala> set_hashset1   // 修改之后的hashset集合
res21: scala.collection.mutable.HashSet[Int] = Set(7, 4)

scala> set_set // set_set集合中的元素
res22: scala.collection.immutable.Set[Int] = Set(66, 77, 88)

三,set集合的通用函数

1,查看集合中的元素个数    size

scala> set1.size
res2: Int = 3

scala> set1
res3: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

 2,获取set集合中的第一个元素   head

scala> set1
res4: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set1.head
res5: Int = 1

 3,获取set集合中除第一个之外的其他元素    tail

scala> set1
res6: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

scala> set1.tail
res7: scala.collection.immutable.Set[Int] = Set(2, 3)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

http-only原理与防御XSS实践

目录预备知识XSS攻击实验目的实验环境实验步骤一触发XSS漏洞实验步骤二引入Http-only实验步骤三验证http–only在防御XSS攻击时的作用预备知识 XSS攻击 http-only的设计主要是用来防御XSS攻击,所以学习本实验的读者应首先了解XSS攻击的相关原理内容。 跨站点脚本攻…

Vue 2 如何添加 register-service-worker 以实现缓存请求的目的

Vue 2 如何添加 register-service-worker 以实现缓存请求的目的 一、问题描述 现在 vue 3 的模板中是自带 register-service-worker 的。 用这个的好处是,它会自动将项目中的所有文件请求缓存到 service-worker 中,以实现再次打开网站的时候会非常非常…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java校园二手物品交易系统051x4

做毕业设计一定要选好题目。毕设想简单,其实很简单。这里给几点建议: 1:首先,学会收集整理,年年专业都一样,岁岁毕业人不同。很多人在做毕业设计的时候,都犯了一个错误,那就是不借鉴…

HTB-Tier1

HTB-Tier1 Appointment Task 1 What does the acronym SQL stand for? ********** ***** *******e Structured Query Language Hide Answer Task 2 What is one of the most common type of SQL vulnerabilities? *** ********n sql injection Hide Answer Task …

汉字风格迁移篇----EasyFont:一个基于风格学习的系统,可以轻松构建大规模手写字体

文章目录abstract1 INTRODUCTION2 RELATED WORK3 METHOD DESCRIPTION3.1 Selecting Input Character Set3.2 Learning Font Skeleton Manifold3.2.1 Character Matching.3.2.2 Training the GP-LVM3.3 Text Segmentation3.4 Stroke Extraction3.5 Overall Style Learning3.5.1 …

UNet - 数据加载 Dataset

目录 1. 介绍 2. 数据处理 dataset 2.1 预处理 2.2 加载数据 2.2.1 初始化 2.2.2 返回数据 2.2.3 样本数量 3. 测试一下 4. 完整代码 1. 介绍 之前介绍完了Unet网络的搭建,接下来说一下要解决的任务。 本章介绍的是:数据的加载处理 下面是整…

hadoop 3.3大数据集群搭建系列1-安装hadoop

文章目录一. 软硬件配置1.1 主机配置及规划1.2 软件配置1.3 安装常用的工具二. 安装前准备2.1 设置主机名2.2 设置hosts2.3 关闭防火墙2.4 ssh免密登陆2.5 ntpdate时间同步三. 安装3.1 安装hadoop3.1.1 下载hadoop并解压3.1.2 配置hadoop_home环境变量3.1.3 编辑etc/hadoop/had…

【毕业设计】图像识别垃圾分类系统 - python 深度学习

文章目录0 前言1 简介2 识别效果3 实现3.1 数据集3.2 实现原理和方法3.3 网络结构4 最后0 前言 🔥 Hi,大家好,这里是丹成学长的毕设系列文章! 🔥 对毕设有任何疑问都可以问学长哦! 这两年开始,各个学校对…

信息熵,交叉熵,KL散度,互信息一网打尽

talk 一直以来都是自己有时候 想去搞明白就搜搜博客看,模棱两可,记忆也比较模糊,这次直接较为系统的记录一下,之后忘了也能看看~ 1. 信息熵 这个概念是从信息论出现的,是香农定义的,根据事件发生的概率进…

excel怎么设置密码?加密文件这么做!

我们都知道,很多时候需要我们在电脑上保存很多excel文件。为了避免在工作中出现意外,我们需要在文件中设置一个安全密码。那么,电子表格excel怎么设置密码呢?如果我们设置了密码,想要取消原本的密码或者重新设置一个密…

Windows无法启动这个硬件设备(代码19)怎么办?

在我们使用电脑的过程中,遇到“由于其配置信息(注册表中的)不完整或已损坏,Windows无法启动这个硬件设备(代码19)”的提示时该如何解决呢? Windows无法启动这个硬件设备(代码19),如何…

干货整理| 深度学习入门知识

一、深度学习的定义 深度学习(Deep Learning),简称:DL,是一种实现机器学习的技术。 人工智能(AI)的概念是在1955 年提出的;机器学习(ML)概念是在1990 年提出…

springboot 整合clickhouse

最近需要做一个项目 需要整合clickhouse 本来有现成的项目,复制一下就好了。但是想自己从头开始一个个文件搭建 但是还是遇到了很多坑, 这就是传说中的约定优于配置吗 1 首先第一步application启动的时候 启动完了,就会退出&#xff0c…

[附源码]计算机毕业设计JAVA房屋租赁管理系统

[附源码]计算机毕业设计JAVA房屋租赁管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybati…

C++QT实现压缩文件、文件夹和解压缩操作

一、前言 QZipWriter是用来压缩文件的类,需要在安装Qt是选择Sources源码安装。否则,无法使用QZipWriter。 1. QZipWriter函数说明 1.1 构造方法: QZipWriter(const QString &fileName, QIODevice::OpenMode mode (QIODevice::WriteOnl…

控制游戏人物移动的细节到底有多少?

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 收录于专栏 unity实战入门 在游戏中我们在做控制游戏物体移动时会碰到以下常见的几种情况: 文章目录在游戏中…

adb shell AT指令发送短信

开启两个,命令行窗口。都进入adb shell。 查看 /dev下的smd设备节点,选取一个进行读写操作 一个窗口用来进行读,另一个窗口进行写入指令操作,读取和写入的节点需要一致。 SH4-1:/ # ls /dev/smd* ls /dev/smd* /dev/smd11 /dev/…

隐式神经表示一:神经网络拟合图像Implicit Neural Representations with Periodic Activation Functions

文章目录1. Implicit Neural Representations with Periodic Activation Functions0. 什么是隐式神经表示1. 了解SineLayer的初始化,还是没了解。。。2. 均匀分布3. Lemma 1.14. 一个简单实验, 拟合图像4.1 网络模型代码如下,就是全连接网络,…

【自然语言处理(NLP)】基于BiLSTM+CRF的事件抽取

【自然语言处理(NLP)】基于BiLSTMCRF的事件抽取 作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学…

Centos 7 安装 wget

文章目录1. wget命令详解:2.查看帮助手册3.使用 wget 下载单个文件4.使用 wget -O 下载并以不同的文件名保存5.使用 wget -c 断点续传6.使用 wget -b 后台下载1. wget命令详解: wget是Linux中的一个下载文件的工具,wget是在Linux下开发的开放源代码的软件&#xff…