Scala集合操作

集合简介

Scala 中拥有多种集合类型,主要分为可变的和不可变的集合两大类:

可变集合: 可以被修改。即可以更改,添加,删除集合中的元素;

不可变集合类:不能被修改。对集合执行更改,添加或删除操作都会返回一个新的集合,而不是修改原来的集合。

集合结构

Scala 中的大部分集合类都存在三类变体,分别位于 scala.collection, scala.collection.immutable, scala.collection.mutable 包中。还有部分集合类位于 scala.collection.generic 包下。

scala.collection.immutable:包是中的集合是不可变的;

scala.collection.mutable:包中的集合是可变的;

scala.collection:包中的集合,既可以是可变的,也可以是不可变的。

val sortSet = scala.collection.SortedSet(1, 2, 3, 4, 5)
val mutableSet = collection.mutable.SortedSet(1, 2, 3, 4, 5)
val immutableSet = collection.immutable.SortedSet(1, 2, 3, 4, 5)

如果你仅写了 Set 而没有加任何前缀也没有进行任何 import,则 Scala 默认采用不可变集合类。

scala> Set(1,2,3,4,5)
res0: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

2.1 scala.collection

scala.collection 包中所有集合如下图:

2.2 scala.collection.mutable

scala.collection.mutable 包中所有集合如下图:

2.3  scala.collection.immutable

scala.collection.immutable 包中所有集合如下图:

Trait Traversable

Scala 中所有集合的顶层实现是 Traversable 。它唯一的抽象方法是 foreach:

def foreach[U](f: Elem => U)

实现 Traversable 的集合类只需要实现这个抽象方法,其他方法可以从 Traversable 继承。Traversable 中的所有可用方法如下

方法

作用

Abstract Method:

xs foreach f

为 xs 的每个元素执行函数 f

Addition:

xs ++ ys

一个包含 xs 和 ys 中所有元素的新的集合。 ys 是一个 Traversable 或 Iterator。

Maps:

xs map f

对 xs 中每一个元素应用函数 f,并返回一个新的集合

xs flatMap f

对 xs 中每一个元素应用函数 f,最后将结果合并成一个新的集合

xs collect f

对 xs 中每一个元素调用偏函数 f,并返回一个新的集合

Conversions:

xs.toArray

将集合转化为一个 Array

xs.toList

将集合转化为一个 List

xs.toIterable

将集合转化为一个 Iterable

xs.toSeq

将集合转化为一个 Seq

xs.toIndexedSeq

将集合转化为一个 IndexedSeq

xs.toStream

将集合转化为一个延迟计算的流

xs.toSet

将集合转化为一个 Set

xs.toMap

将一个(key, value)对的集合转化为一个 Map。 如果当前集合的元素类型不是(key, value)对形式, 则报静态类型错误。

Copying:

xs copyToBuffer buf

拷贝集合中所有元素到缓存 buf

xs copyToArray(arr,s,n)

从索引 s 开始,将集合中最多 n 个元素复制到数组 arr。 最后两个参数是可选的。

Size info:

xs.isEmpty

判断集合是否为空

xs.nonEmpty

判断集合是否包含元素

xs.size

返回集合中元素的个数

xs.hasDefiniteSize

如果 xs 具有有限大小,则为真。

Element Retrieval:

xs.head

返回集合中的第一个元素(如果无序,则随机返回)

xs.headOption

以 Option 的方式返回集合中的第一个元素, 如果集合为空则返回 None

xs.last

返回集合中的最后一个元素(如果无序,则随机返回)

xs.lastOption

以 Option 的方式返回集合中的最后一个元素, 如果集合为空则返回 None

xs find p

以 Option 的方式返回满足条件 p 的第一个元素, 如果都不满足则返回 None

Subcollection:

xs.tail

除了第一个元素之外的其他元素组成的集合

xs.init

除了最后一个元素之外的其他元素组成的集合

xs slice (from, to)

返回给定索引范围之内的元素组成的集合 (包含 from 位置的元素但不包含 to 位置的元素)

xs take n

返回 xs 的前 n 个元素组成的集合(如果无序,则返回任意 n 个元素)

xs drop n

返回 xs 的后 n 个元素组成的集合(如果无序,则返回任意 n 个元素)

xs takeWhile p

从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有遍历到的值。

xs dropWhile p

从第一个元素开始查找满足条件 p 的元素, 直到遇到一个不满足条件的元素,返回所有未遍历到的值。

xs filter p

返回满足条件 p 的所有元素的集合

xs withFilter p

集合的非严格的过滤器。后续对 xs 调用方法 map、flatMap 以及 withFilter 都只用作于满足条件 p 的元素,而忽略其他元素

xs filterNot p

返回不满足条件 p 的所有元素组成的集合

Subdivisions:

xs splitAt n

在给定位置拆分集合,返回一个集合对 (xs take n, xs drop n)

xs span p

根据给定条件拆分集合,返回一个集合对 (xs takeWhile p, xs dropWhile p)。即遍历元素,直到遇到第一个不符合条件的值则结束遍历,将遍历到的值和未遍历到的值分别放入两个集合返回。

xs partition p

按照筛选条件对元素进行分组

xs groupBy f

根据鉴别器函数 f 将 xs 划分为集合映射

Element Conditions:

xs forall p

判断集合中所有的元素是否都满足条件 p

xs exists p

判断集合中是否存在一个元素满足条件 p

xs count p

xs 中满足条件 p 的元素的个数

Folds:

(z /: xs) (op)

以 z 为初始值,从左到右对 xs 中的元素执行操作为 op 的归约操作

(xs :\ z) (op)

以 z 为初始值,从右到左对 xs 中的元素执行操作为 op 的归约操作

xs.foldLeft(z) (op)

同 (z /: xs) (op)

xs.foldRight(z) (op)

同 (xs :\ z) (op)

xs reduceLeft op

从左到右对 xs 中的元素执行操作为 op 的归约操作

xs reduceRight op

从右到左对 xs 中的元素执行操作为 op 的归约操作

Specific Folds:

xs.sum

累计求和

xs.product

累计求积

xs.min

xs 中的最小值

xs.max

xs 中的最大值

String:

xs addString (b, start, sep, end)

向 StringBuilder  b 中添加一个字符串, 该字符串包含 xs 的所有元素。start、seq 和 end  都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。

xs mkString (start, seq, end)

将集合转化为一个字符串。start、seq 和 end  都是可选的,seq 为分隔符,start 为开始符号,end 为结束符号。

xs.stringPrefix

返回 xs.toString 字符串开头的集合名称

Views:

xs.view

生成 xs 的视图

xs view (from, to)

生成 xs 上指定索引范围内元素的视图

下面为部分方法的使用示例:

scala> List(1, 2, 3, 4, 5, 6).collect { case i if i % 2 == 0 => i * 10 }
res0: List[Int] = List(20, 40, 60)scala> List(1, 2, 3, 4, 5, 6).withFilter(% 2 == 0).map(* 10)
res1: List[Int] = List(20, 40, 60)scala> (10 /: List(1, 2, 3)) (+ _)
res2: Int = 16scala> List(1, 2, 3, -4, 5) takeWhile (> 0)
res3: List[Int] = List(1, 2, 3)scala> List(1, 2, 3, -4, 5) span (> 0)
res4: (List[Int], List[Int]) = (List(1, 2, 3),List(-4, 5))scala> List(1, 2, 3).mkString("[","-","]")
res5: String = [1-2-3]

4 Trait Iterable

Scala 中所有的集合都直接或者间接实现了 Iterable 特质,Iterable 拓展自 Traversable,并额外定义了部分方法:

方法

作用

Abstract Method:

xs.iterator

返回一个迭代器,用于遍历 xs 中的元素, 与 foreach 遍历元素的顺序相同。

Other Iterators:

xs grouped size

返回一个固定大小的迭代器

xs sliding size

返回一个固定大小的滑动窗口的迭代器

Subcollections:

xs takeRigtht n

返回 xs 中最后 n 个元素组成的集合(如果无序,则返回任意 n 个元素组成的集合)

xs dropRight n

返回 xs 中除了最后 n 个元素外的部分

Zippers:

xs zip ys

返回 xs 和 ys 的对应位置上的元素对组成的集合

xs zipAll (ys, x, y)

返回 xs 和 ys 的对应位置上的元素对组成的集合。其中较短的序列通过附加元素 x 或 y 来扩展以匹配较长的序列。

xs.zipWithIndex

返回一个由 xs 中元素及其索引所组成的元素对的集合

Comparison:

xs sameElements ys

测试 xs 和 ys 是否包含相同顺序的相同元素

所有方法示例如下:

scala> List(1, 2, 3).iterator.reduce(* _ * 10)
res0: Int = 600scala> List("a","b","c","d","e") grouped 2 foreach println
List(a, b)
List(c, d)
List(e)scala> List("a","b","c","d","e") sliding 2 foreach println
List(a, b)
List(b, c)
List(c, d)
List(d, e)scala>  List("a","b","c","d","e").takeRight(3)
res1: List[String] = List(c, d, e)scala> List("a","b","c","d","e").dropRight(3)
res2: List[String] = List(a, b)scala> List("a","b","c").zip(List(1,2,3))
res3: List[(String, Int)] = List((a,1), (b,2), (c,3))scala> List("a","b","c","d").zipAll(List(1,2,3),"",4)
res4: List[(String, Int)] = List((a,1), (b,2), (c,3), (d,4))scala> List("a","b","c").zipAll(List(1,2,3,4),"d","")
res5: List[(String, Any)] = List((a,1), (b,2), (c,3), (d,4))scala> List("a", "b", "c").zipWithIndex
res6: List[(String, Int)] = List((a,0), (b,1), (c,2))scala> List("a", "b") sameElements List("a", "b")
res7: Boolean = truescala> List("a", "b") sameElements List("b", "a")
res8: Boolean = false

 修改集合

当你想对集合添加或者删除元素,需要根据不同的集合类型选择不同的操作符号:

操作符

描述

集合类型

coll(k)

即 coll.apply(k)

获取指定位置的元素

Seq, Map

coll :+ elem

elem +: coll

向集合末尾或者集合头增加元素

Seq

coll + elem

coll + (e1, e2, ...)

追加元素

Seq, Map

coll - elem

coll - (e1, e2, ...)

删除元素

Set, Map, ArrayBuffer

coll ++ coll2

coll2 ++: coll

合并集合

Iterable

coll -- coll2

移除 coll 中包含的 coll2 中的元素

Set, Map, ArrayBuffer

elem :: lst

lst2 :: lst

把指定列表 (lst2) 或者元素 (elem) 添加到列表 (lst) 头部

List

list ::: list2

合并 List

List

set | set2

set & set2

set &~ set2

并集、交集、差集

Set

coll += elem

coll += (e1, e2, ...)

coll ++= coll2

coll -= elem

coll -= (e1, e2, ...)

coll --= coll2

添加或者删除元素,并将修改后的结果赋值给集合本身

可变集合

elem +=: coll

coll2 ++=: coll

在集合头部追加元素或集合

ArrayBuffer

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CSDN规则详解(一)

文章目录 前言CSDN博客用户准则总则博客注册博客行为规则被投诉侵权用户处理规则附则 博客积分规则博客等级博客VIP文章说明后记 前言 CSDN是一个专业的技术社区,不仅可以分享自己的技术经验,还可以向其他行业专业人士学习。在CSDN上写出优秀的博客可以…

tcp/ip协议2实现的插图,数据结构2 (15 - 章)

(40) 40 十五1 插口层 结构socket,sysent (41) 41 十五2 插口层 实用函数与file结构描述汇总 (42) 42 十五3 插口层 函socket,socreate,pr_usrreq (43)

第23期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区,集成了生成预训练 Transformer(GPT)、人工智能生成内容(AIGC)以及大型语言模型(LLM)等安全领域应用的知识。在这里,您可以…

适用于 Linux 的 WPF:Avalonia

许多年前,在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前,有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在,XAML 标准是一个词汇规范。 Avalonia 是一个开…

软考之软件工程基础理论知识

软件工程基础 软件开发方法 结构化方法 将整个系统的开发过程分为若干阶段,然后依次进行,前一阶段是后一阶段的工作依据按顺序完成。应用最广泛。特点是注重开发过程的整体性和全局性。缺点是开发周期长文档设计说明繁琐,工作效率低开发前要…

数据库存储引擎和锁

存储引擎: mysal当中数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制,索引技巧,锁定水平以及最终提供的不同功能和能力,这些就是我们说的存储引擎。 功能: 1、mysql将数据存储在文件系…

【LeetCode刷题-链表】--1290.二进制链表转整数

1290.二进制链表转整数 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }*…

低代码开发,一场深度的IT效率革命

目录 一、前言 二、低代码迅速流行的理由 三、稳定性和生产率的最佳实践 四、程序员用低代码开发应用有哪些益处? 1、提升开发价值 2、利于团队升级 五、总结 一、前言 尽管IT技术支撑了全球的信息化浪潮,然而困扰行业已久的软件开发效率并未像摩尔定律那…

k8s、调度约束

Kubernetes 是通过 List-Watch **** 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦 用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。 APIS…

【sql注入】sql关卡1~4

前言: 靶场自取 level-1 测试注入点 POC: 1,1,1,1"",1/1,1/0 》存在注入点 爆破 POC: id-1andextractvalue(1,concat(0x7e,user(),0x7e))-- level-2 尝试注入点 POC1:admin POC2:admin POC3:adminandsleep(3)-- POC4: adminandif(1,1,0)0-- POC…

按键精灵开发环境搭建

按键精灵是一个可用于编写自动化执行程序的软件,不仅可以用于PC端,也可以用于手机端,平台稳定,生态良好,开发快捷,是自动化软件开发必不可少的利器。 1. 下载软件 官网:按键精灵_按键精灵论坛…

OpenCV实战——OpenCV.js介绍

OpenCV实战——OpenCV.js介绍 0. 前言1. OpenCV.js 简介2. 网页编写3. 调用 OpenCV.js 库4. 完整代码相关链接 0. 前言 本节介绍如何使用 JavaScript 通过 OpenCV 开发计算机视觉算法。在 OpenCV.js 之前,如果想要在 Web 上执行一些计算机视觉任务,必须…

这个超实用的门禁技巧,让办公楼安全更简单高效!

门禁监控是现代社会中不可或缺的一部分,用于确保安全和管理进出某个区域的人员。随着科技的不断发展,门禁监控已经远离了传统的机械锁和钥匙,变得更加智能化和高效。 客户案例 企业办公大楼 无锡某大型企业在其办公大楼内部部署了泛地缘科技…

12.JavaScript(WebAPI) - JS api文献精解

文章目录 1.WebAPI 背景知识1.1什么是 WebAPI1.2什么是 API1.3API 参考文档 2.DOM 基本概念2.1什么是 DOM2.2DOM 树 3.获取元素3.1querySelector3.2querySelectorAll 4.事件初识4.1基本概念4.2事件三要素4.3简单示例 5.操作元素5.1获取/修改元素内容5.1.1innerText5.1.2innerHT…

tbh常用的绘图快捷键

1、Altb -> 笔刷 2、Alt/ -> 画笔 3、按住Shift 绘出的线条是直线 4、按住shiftalt 绘出来的线条是水平线或垂直线 5、alte ->橡皮擦 6、alts ->选择工具 7、altq -> 轮廓编辑器 以下操作都是在选中轮廓编辑器下操作的: 按住alt…

Linux 将Qt程序打包为AppImage包

前言 在 Linux 环境下,开发完 Qt 程序后,也需要制作为一个安装包或者可执行文件进行分发。这里介绍使用 linuxdeployqt 将 Qt 程序打包为 .AppImage 应用程序(类似于 Windows 的绿色免安装软件) 环境配置 配置 Qt 环境变量 这…

TensorFlow案例学习:简单的音频识别

前言 以下内容均来源于官方教程:简单的音频识别:识别关键字 音频识别 下载数据集 下载地址:http://storage.googleapis.com/download.tensorflow.org/data/mini_speech_commands.zip 可以直接浏览器访问下载。 下载完成后将其解压到项目…

路由器基础(九):防火墙基础

防火墙 (Fire Wall) 是网络关联的重要设备,用于控制网络之间的通信。外部网络用户的访问必须先经过安全策略过滤,而内部网络用户对外部网络的访问则无须过滤。现在的防火墙还具有隔离网络、提供代理服务、流量控制等功能。 一、三种防火墙技术 常见的…

医疗数据可视化大屏:重构医疗决策的未来

医疗行业一直是信息密集型领域之一,它的复杂性不仅在于患者病历和医疗数据的海量积累,还包括了病情诊断、医疗资源分配、病患治疗等多层次的挑战。随着信息技术的不断发展,医疗数据可视化大屏成为了一种创新性的工具,它为医疗管理…

openGauss学习笔记-113 openGauss 数据库管理-设置安全策略-设置帐户安全策略

文章目录 openGauss学习笔记-113 openGauss 数据库管理-设置安全策略-设置帐户安全策略113.1 背景信息113.2 自动锁定和解锁帐户113.2.1 配置failed_login_attempts参数113.2.2 配置password_lock_time参数 113.3 手动锁定和解锁帐户113.4 删除不再使用的帐户 openGauss学习笔记…