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.mzph.cn/news/129467.shtml

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

相关文章

基于单片机控制的GSM短信模块家庭防盗报警系统

博主主页:单片机辅导设计 博主简介:专注单片机技术领域和毕业设计项目。 主要内容:毕业设计、简历模板、学习资料、技术咨询。 文章目录 主要介绍一、内容1 设计任务和要求1 主要内容 二、系统总体方案2.1 系统整体设计思路2.2 系统方案设计 …

【入门Flink】- 03Flink部署

集群角色 Flik提交作业和执行任务,需要几个关键组件: 客户端(Client):代码由客户端获取并做转换,之后提交给JobManger JobManager:就是Fink集群里的“管事人”,对作业进行中央调度管理;而它获…

【ES专题】ElasticSearch 高级查询语法Query DSL实战

目录 前言阅读对象阅读导航前置知识数据准备笔记正文一、ES高级查询Query DSL1.1 基本介绍1.2 简单查询之——match-all(匹配所有)1.2.1 返回源数据_source1.2.2 返回指定条数size1.2.3 分页查询from&size1.2.4 指定字段排序sort 1.3 简单查询之——…

服务上千家企业,矩阵通2.0重磅上线,全链路管理新媒体矩阵

自上线以来 矩阵通已服务了上千家企业级客户 覆盖汽车、家居、媒体、金融、教育等多个行业 矩阵通1.0时代 我们以“数据”为基座打造出10功能 帮助企业轻松管理新媒体矩阵 实现账号管理、数据分析、竞对监测、 人员考核、风险监管等需求 而现在 矩阵通2.0重磅上线 新增…

0基础学习PyFlink——个数滑动窗口(Sliding Count Windows)

大纲 滑动(Sliding)和滚动(Tumbling)的区别样例窗口为2,滑动距离为1窗口为3,滑动距离为1窗口为3,滑动距离为2窗口为3,滑动距离为3 完整代码参考资料 在 《0基础学习PyFlink——个数…

使用vscode实现远程开发,并通过内网穿透在公网环境下远程连接

文章目录 前言1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 前言 远程…

学习笔记三十四:Ingress和 Ingress Controller概述

Ingress和 Ingress Controller概述 回顾service四层负载在k8s中为什么要做负载均衡Service不足之处四层负载和七层负载的区别OSI七层模型: Ingress介绍Ingress Controller介绍Ingress-controller 作用Ingress和Ingress Controller总结使用Ingress Controller代理k8s…

设备接入服务组件->微服务and容器化改造说明文档

SVN路径 https://192.0.0.241/USTA-dac/branches/dev/V1.10.500/dac 目录结构 das为设备接入服务,负责驱动管理,资源同步,订阅下发。下面有两个文件夹分别对应了openssl1.0的版本和后面更换接口后openssl1.1的版本。das_proxy为设备信令下发…

家用NAS上的Linux虚拟机上安装Domino

大家好,才是真的好。 此篇不是广告,毕竟没有任何人给广告费。 就是我个人入手了一台NAS设备,一开始用途比较淳朴,仅仅存储和家庭有关的各种照片和视频,但用着用着,就发现了NAS设备的拓展性之强&#xff0…

kubernetes集群编排——k8s存储

configmap 字面值创建 kubectl create configmap my-config --from-literalkey1config1 --from-literalkey2config2kubectl get cmkubectl describe cm my-config 通过文件创建 kubectl create configmap my-config-2 --from-file/etc/resolv.confkubectl describe cm my-confi…

提示3D标题编辑器仍在运行怎么解决,以及3D标题编辑器怎么使用

在进行视频剪辑时,尤其是剪辑一些带有文字的开场视频,一般都会使用具有立体效果的3D标题,这样制作出来的视频效果不仅好看,还非常的炫酷,但是对于一些刚刚开始接触视频剪辑的小伙伴来说,可能对3D标题还不是…

【李群李代数】【manif 】基于固定信标的2D机器人定位 (Error State Kalman Filter)...

demo演示 运行结果 我们考虑一个机器人在平面上被少量的准时地标或_信标 包围。 机器人以轴向速度和角速度的形式接收控制动作,并且能够测量信标相对于其自身参考系的位置。 机器人位姿 X 在 SE(2) 中,信标位置 b_k 在 R^2 中, | cos th -si…

Android系统Launcher启动流程学习(二)launcher启动

Zygote(孵化器)进程启动 在init进程中有解析.rc文件,在这个rc文件中配置了一个重要的服务service–zygote,这是app程序的鼻祖 zygote进程主要负责创建Java虚拟机,加载系统资源,启动SystemServer进程&#…

Postgresql批量按照顺序更新某一个字段

如批量更新采购订单行sequence字段,按照订单行id的顺序赋值1,2,3,4...: UPDATE purchase_order_line_copy1 SET sequence subquery.new_sequence FROM (SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS new_sequence…

Pytest-Allure及Allure命令使用

一、Allure介绍 Allure是Pytest用于生成测试报告的框架,提供丰富的测试报告功能; 二、Allure安装 Allure安装分为2块,分别是pytest-Allure库安装,本地生成报告并导出的命令行allure安装; 1、pytest-Allure库安装 …

时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-CNN-LSTM差分自回归移动平均模型结合卷积长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 …

【vtk学习笔记4】基本数据类型

一、可视化数据的基本特点 可视化数据有以下特点: 离散型 计算机处理的数据是对无限、连续的空间进行采样,生成的有限采样点数据。在某些离散点上有精确的值,但点与点之间值不可知,只有通过插值方式获取数据具有规则或不规则的结…

机器学习 - 加油站数据分析

一、实验数据 数据集:“加油站数据.xls” 数据集介绍:该表记录了用户在11月和12月一天24小时内的加油信息,包括:持卡人标识(cardholder)、卡号(cardno)、加油站网点号(n…

Simulink的To Workspace

To Workspace模块将Simulink产生的数据存储到matlab的工作区。 用To Workspace模块中的数据进行绘图。 参见Matlab/simulink/simscape multibody-to wotkspace模块使用_to workspace模块_五VV的博客-CSDN博客To workspace模块入门详解_哔哩哔哩_bilibili(很好&#…