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

2 scala集合-元组和列表

1 元组

元组也是可以存放不同数据类型的元素,并且最重要的是,元组中的元素是不可变的

例如,定义一个元组,包含字符串 hello,数字 20。如果试图把数字 20 修改为 1,则会报错。

scala> var a = ("hello", 20)
var a: (String, Int) = (hello,20)scala> a._1
val res3: String = helloscala> a._2 = 1
-- [E052] Type Error: ----------------------------------------------------------
1 |a._2 = 1|^^^^^^^^|Reassignment to val _2|| longer explanation available when compiling with `-explain`
1 error found

1.1 定义元组

定义元素有两种方法:

  • 使用 () 定义
  • 使用 -> 定义,这种方法定义的元组,最多只能包含2个元素。
scala> val a = (20, "Hello World", true)
val a: (Int, String, Boolean) = (20,Hello World,true)scala> val a = 1->2
val a: (Int, Int) = (1,2)scala> val a = 1->2,3->4
-- Error: ----------------------------------------------------------------------
1 |val a = 1->2,3->4|            ^|            end of statement expected but ',' found

1.2 访问元组

访问元组和访问数组不同,访问元组需要使用 ._index,注意,index 是从 1 开始的。

例如,._1 访问元组的第一个元素,使用 ._2 访问的是元组的第二个元素。

scala> val a = (1, "Hello World", true)
val a: (Int, String, Boolean) = (1,Hello World,true)scala> a._1
val res4: Int = 1scala> a._2
val res5: String = Hello Worldscala> a._3
val res6: Boolean = true

2 列表

列表是 scala 中常用的数据结构,特点是可以保存重复的值,并且有先后顺序。列表和数组一样,分为可变和不可变两种。

在使用可变列表前,需要先引入类 scala.collection.mutable.ListBuffer

2.1 不可变列表

不可变列表的元素和长度都不能更改。

创建不可变列表有如下方法:

val/var variable_name = List(ele1,ele2,ele3,...)		// 创建带有初始化元素的不可变列表
val/var variable_name = ele1 :: ele2 :: Nil				// 创建带有初始化元素的不可变列表
val/var variable_name = Nil								// 创建一个空的不可变列表

根据上述3种创建方式,创建一个与萨努为 0、1、2、3 的列表:

scala> val list = List(0,1,2,3)
val list: List[Int] = List(0, 1, 2, 3)scala> val list = 0::1::2::3::Nil
val list: List[Int] = List(0, 1, 2, 3)scala> val list = Nil
val list: scala.collection.immutable.Nil.type = List()

2.2 可变列表

可变列表的元素和长度都是可以改变的,创建可变列表的语法如下:

// 创建空的可变列表
val/var variable_name = ListBuffer[Int]()
// 创建带有初始元素的可变列表
val/var variable_name = ListBuffer(ele1, ele2, ele3, ...)

创建一个元素为 0、1、2、3 的可变列表

scala> import scala.collection.mutable.ListBufferscala> val list = ListBuffer()
val list: scala.collection.mutable.ListBuffer[Nothing] = ListBuffer()scala> val list2 = ListBuffer(0,1,2,3)
val list2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3)

2.2.1 添加一个元素到尾部

使用运算符 += 往可变列表尾部追加一个元素。

下面定义一个可变列表,初始元素为 0、1、2、3,添加一个元素 4 到尾部。

scala> import scala.collection.mutable.ListBufferscala> val list = ListBuffer(0,1,2,3)
val list: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3)scala> list += 4
val res7: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3, 4)

2.2.2 删除一个元素

使用运算符 -= ,删除可变列表中的一个元素。

下面定义一个可变列表,初始元素为0、1、2、3,删除元素2。

scala> import scala.collection.mutable.ListBufferscala> val list = ListBuffer(0,1,2,3)
val list: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3)scala> list -= 2
val res8: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 3)

2.2.3 追加一个列表

使用运算符 ++= 往可变列表中追加另外一个列表的所有元素.

scala> val list = ListBuffer(0,1,2,3)
val list: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3)scala> list ++= List(4,5)
val res9: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3, 4, 5)

2.2.4 转为不可变列表

使用 toList 方法,可以把可变列表转换为不可变列表:

scala> import scala.collection.mutable.ListBufferscala> val list = ListBuffer(0,1,2,3)
val list: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3)scala> list.toList
val res10: List[Int] = List(0, 1, 2, 3)

2.2.5 转为不可变数组

使用 toArray 方法,可以把可变列表转换为不可变列表:

scala> import scala.collection.mutable.ListBufferscala> val list = ListBuffer(0,1,2,3)
val list: scala.collection.mutable.ListBuffer[Int] = ListBuffer(0, 1, 2, 3)scala> list.toArray
val res11: Array[Int] = Array(0, 1, 2, 3)

2.3 列表常用操作

2.3.1 判断列表是否为空

使用 isEmpty 方法可以判断列表是否为空:

scala> val list = List(0,1,2,3)
val list: List[Int] = List(0, 1, 2, 3)scala> list.isEmpty
val res12: Boolean = false

2.3.2 拼接两个列表

使用运算符 ++ ,可以拼接两个列表,返回一个新生成的列表。

scala> val list = List(0,1,2,3)
val list: List[Int] = List(0, 1, 2, 3)scala> val tempList = List(4,5)
val tempList: List[Int] = List(4, 5)scala> list++tempList
val res13: List[Int] = List(0, 1, 2, 3, 4, 5)

2.3.3 获取首个元素及剩余部分

使用 head 可以获取列表的首个元素,而 tail 则可以获取除第一个元素外的其他元素,返回的是一个在内存中生成的新列表。

scala> val list = List(0,1,2,3)
val list: List[Int] = List(0, 1, 2, 3)scala> list.head
val res14: Int = 0scala> list.tail
val res15: List[Int] = List(1, 2, 3)

2.2.4 反转列表

使用 reverse 方法可以反转列表。

scala> val list = List(0,1,2,3)
val list: List[Int] = List(0, 1, 2, 3)scala> list.reverse
val res16: List[Int] = List(3, 2, 1, 0)

2.2.5 获取列表前缀和后缀

使用 take 方法可以获取前几个元素,而 drop 方法获取第几个元素后的元素。

scala> val list = List(0,1,2,3)
val list: List[Int] = List(0, 1, 2, 3)scala> list.take(3)
val res18: List[Int] = List(0, 1, 2)scala> list.drop(3)
val res19: List[Int] = List(3)

2.2.6 扁平化

扁平化适用于一个列表中包含多个列表的场景。使用 flatten 方法,可以将某个列表中包含的列表元素提取出来放在另一个列表中,如果列表中有相同的元素,会保留。

scala> val list = List(List(0), List(2,3), List(1), List(0))
val list: List[List[Int]] = List(List(0), List(2, 3), List(1), List(0))scala> list.flatten
val res21: List[Int] = List(0, 2, 3, 1, 0)

2.2.7 拉链

拉链是指,将两个列表通过相同的索引组成一个元素为元素的列表。

scala> val studentName = List("student1", "student2", "student3")
val studentName: List[String] = List(student1, student2, student3)scala> val studentClass = List("class1", "class2", "class3", "class4")
val studentClass: List[String] = List(class1, class2, class3, class4)scala> studentName.zip(studentClass)
val res22: List[(String, String)] = List((student1,class1), (student2,class2), (student3,class3))

2.2.8 拉开

拉开就是讲一个拉链的列表拉开,生成包含对应列表元素的元组。

scala> val studentName = List("student1", "student2", "student3")
val studentName: List[String] = List(student1, student2, student3)scala> val studentClass = List("class1", "class2", "class3", "class4")
val studentClass: List[String] = List(class1, class2, class3, class4)scala> val zipList = studentName.zip(studentClass)
val zipList: List[(String, String)] = List((student1,class1), (student2,class2), (student3,class3))scala> zipList.unzip
val res23: (List[String], List[String]) = (List(student1, student2, student3),List(class1, class2, class3))

2.2.9 连接成字符串

使用 mkString,可以通过分隔符把列表的元素转换字符串。

scala> val list = List(0,1,2,3)
val list: List[Int] = List(0, 1, 2, 3)scala> list.mkString(",")
val res24: String = 0,1,2,3

2.2.1 求并集

使用 union 方法可以取两个集合的并集,不去重。如果需要去重,则需要调用 distinct

scala> val list1 = List(0,1,2,3)
val list1: List[Int] = List(0, 1, 2, 3)scala> val list2 = List(2,4,5,6)
val list2: List[Int] = List(2, 4, 5, 6)scala> val unionList = list1.union(list2)
val unionList: List[Int] = List(0, 1, 2, 3, 2, 4, 5, 6)scala> unionList.distinct
val res25: List[Int] = List(0, 1, 2, 3, 4, 5, 6)

2.2.2 求交集

使用 intersect 放可取两个列表的交集。

scala> val list1 = List(0,1,2,3)
val list1: List[Int] = List(0, 1, 2, 3)scala> val list2 = List(2,4,5,6,3)
val list2: List[Int] = List(2, 4, 5, 6, 3)scala> list1.intersect(list2)
val res26: List[Int] = List(2, 3)

2.2.3 求差集

使用 diff 方法,可以求两个列表的差集,例如 list1.diff(list2) 表示取 list1 中 list2 中不包含的元素

scala> val list1 = List(0,1,2,3)
val list1: List[Int] = List(0, 1, 2, 3)scala> val list2 = List(2,4,5,6,3)
val list2: List[Int] = List(2, 4, 5, 6, 3)scala> list1.diff(list2)
val res27: List[Int] = List(0, 1)

相关文章:

2 scala集合-元组和列表

1 元组 元组也是可以存放不同数据类型的元素,并且最重要的是,元组中的元素是不可变的。 例如,定义一个元组,包含字符串 hello,数字 20。如果试图把数字 20 修改为 1,则会报错。 scala> var a ("…...

Spring Boot开启SSL/Https进行交互。

为2个springboot工程开启进行SSL进行交互的认证步骤 //哪个犬玩意举报我侵权的? 一、认证步骤 1、 为服务器生成证书 keytool -genkey -v -alias testServer -keyalg RSA -keystore E:\ssl\testServer.p12 -validity 36500 2、 为客户端生成证书 keytool -genkey -v -alias…...

88.Go设计优雅的错误处理

文章目录 导言一、Go 的约定二、简单错误创建1、 errors.New()2、fmt.Errorf() 三、哨兵错误四、对错误进行编程1、优雅的错误处理设计2、与错误有关的的API 五、总结 导言 在 75.错误码设计、实现统一异常处理和封装统一返回结果 中,我们介绍了错误码的设计&#…...

Python4Delphi: Delphi 程序使用 Python 抓取网页

想用程序去抓取一个网页的内容,Delphi 有自己的 HTTP 库。比如 Indy 的 TIdHTTP,或者 TNetHTTPClient。 这里测试一下使用 Python 的 HTTP 库抓取网页,然后把抓取的内容给 Delphi 的程序。 Delphi 程序,界面上拖控件如下&#x…...

编辑器Zed

什么是Zed 官网:https://zed.dev/ Zed 是 Atom 编辑器原作者主导的新项目 —— 一款支持多人协作的代码编辑器,底层采用 Rust,且默认支持 Rust,还自带了 rust-analyzer,主打 “高性能”,颜值也十分在线&a…...

Java的接口

目录 1.接口的概念 2.语法规则 3.接口的使用 4.接口的特性 总结: 5.实现多个接口 6.接口间的继承 1.接口的概念 接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成…...

【计算机网络】计算机软件工程人工智能研究生复试资料整理

1、JAVA 2、计算机网络 3、计算机体系结构 4、数据库 5、计算机租场原理 6、软件工程 7、大数据 8、英文 自我介绍 2. 计算机网络 1. TCP如何解决丢包和乱序? 序列号:TCP所传送的每段数据都有标有序列号,避免乱序问题发送端确认应答、超时重传:解决丢包问题滑动窗口:避免…...

【Network Management】AUTOSAR架构下CanNm User Data详解

目录 前言 正文 1.CanNm user data概念 2.CanNm user data配置 2.1CDD方式访问CanNm user data...

量子算法入门——2.线性代数与复数

参考资料: 【【零基础入门量子计算-第03讲】线性代数初步与复数】 来自b站up:溴锑锑跃迁 建议关注他的更多高质量文章:CSDN:【溴锑锑跃迁】 0. 前言 强烈建议搭配b站原视频进行观看,这只是我当时看的笔记&#xff0c…...

分别通过select、多进程、多线程实现一个并发服务器

多进程 #include<myhead.h>#define PORT 8888 //端口号 #define IP "192.168.114.74" //IP地址//定义函数处理客户端信息 int deal_cli_msg(int newfd, struct sockaddr_in cin) {//5、收发数据使用newfd完成通信char buf[128] "&qu…...

如何在 emacs 上开始使用 Tree-Sitter (archlinux)

文章目录 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 在archlinux上使用比windows上不知道要方便多少倍&#xff01; $ sudo pacman -S emacs $ sudo pacman -S tree-sitter这里…...

FL Studio2024最新中文版有哪些其新功能特点?

除了之前提到的特点外&#xff0c;FL Studio 21还有以下一些值得注意的特点&#xff1a; 高效的音频处理&#xff1a;FL Studio 21具备高效的音频处理能力&#xff0c;能够实时处理多轨道音频&#xff0c;提供低延迟的音频播放和录制&#xff0c;确保音乐制作过程中的流畅性和实…...

Oracle的学习心得和知识总结(三十二)|Oracle数据库数据库回放功能之论文四翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…...

系统架构27 - 软件架构设计(6)

基于架构的软件开发方法 基于架构的软件开发方法&#xff08;ABSD&#xff09;概述概念与术语开发模型体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构的演化 基于架构的软件开发方法&#xff08;ABSD&#xff09; 基于体系结构的软件设计 (Architec…...

STM32 cubemx配置DMA+空闲中断接收不定长数据

文章目录 前言一、串口空闲中断二、DMA空闲中断接收不定长数据实现思路三、STM32Cubemx配置DMA空闲中断接收不定长数据四、代码编写总结 前言 本篇文章给大家讲解一下DMA串口空闲中断接收串口不定长数据&#xff0c;之前我们也是讲解过串口接收不定长数据的&#xff0c;那么本…...

Pycharm配置运行selenium教程

一、下载chrome浏览器和同版本的chromedriver chrome测试版版本120.0.6099.109 链接&#xff1a;https://pan.baidu.com/s/1pvFqL0WN8OkqPmURAs83kg?pwdvtsh 提取码&#xff1a;vtsh chromedriver版本120.0.6099.109 链接&#xff1a;https://pan.baidu.com/s/16fWWkrlD5C3J…...

银河麒麟V10开机后黑屏解决方法

情况描述&#xff1a; 单位的国产化电脑采用银河麒麟V10系统&#xff0c;在使用了近两个月时间后&#xff0c;开机到加载桌面那一步无法加载图形化桌面。 原理讲解 Linux本是纯命令行形式的系统&#xff0c;银河麒麟基于Linux中的Ubuntu LTS内核开发&#xff0c;其图形化的品牌…...

【Git版本控制 02】分支管理

目录 一、创建分支 二、切换分支 三、合并分支 四、删除分支 五、合并冲突 六、分支策略 七、bug分支 一、创建分支 # 当前仓库只有 master 一个主分支 # 可通过 git branch 是进行分支管理的命令&#xff0c;可通过不同参数对分支进行查看、创建、删除(base) [rootloc…...

基金分类

一、按基金运作方式分类 &#xff08;一&#xff09;封闭式基金 是基金份额总额在期限内固定不变&#xff0c;在期限内不可申购和赎回。 &#xff08;二&#xff09;开放式基金 是基金份额总额不固定&#xff0c;在期限内可以申购和赎回。 这里的开放式基金特指传统的开放式基…...

kali系统概述、nmap扫描应用、john破解密码、抓包概述、以太网帧结构、抓包应用、wireshark应用、nginx安全加固、Linux系统加固

目录 kali nmap扫描 使用john破解密码 抓包 封装与解封装 网络层数据包结构 TCP头部结构​编辑 UDP头部结构 实施抓包 安全加固 nginx安全 防止缓冲区溢出 Linux加固 kali 实际上它就是一个预安装了很多安全工具的Debian Linux [rootmyhost ~]# kali resetkali …...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...