Scala005--Scala中的数据结构【集合】之数组

news2024/11/23 20:19:24

Scala中的数据结构和Java中一样,都有数组,列表,集合,映射。在Scala中与Java不同的是数组可以有可变数组,而不是一旦定义就不可以进行更改。我们来认识数组,并使用相应的代码去查看具体的实现效果。

目录

数组

1,不可变数组

1)静态声明

2)动态声明

2,可变数组

1)动态声明一个可变数组

2)使用append函数向可变数组的末尾添加元素

 3)使用insert函数在可变数组的指定位置添加元素

一次只插入一个元素:

一次插入多个元素:

​编辑 4)使用 +=函数在可变数组的末尾追加一个或多个元素

 5)使用++=函数在可变数组中添加同类型的数组

6)使用-=函数去指定删除数组中的元素(可以一次性删除多个元素)

7)使用remove函数删除指定索引下标的元素(一次性删除多个)

删除一个元素:

删除多个元素:

3,数组的相关方法

1)获取数组元素个数:size/获取数组长度:length

2)修改数组元素【给数组元素赋值】array[index]=value

3)静态数组转换成动态数组array.toBuffer

4)将Any类型类型的数组进行强转并取出里面的元素array.asInstanceOf[type]

5)获取数组中的最大数max

6)获取数组中的最小数min

7)数组翻转reverse

8)数组排序sorted

 9)遍历数组

10)使用yield关键字对数组元素进行处理(全部)

11)给定长数组添加元素并返回新的数组   :+


 

数组

数组类型默认不可变,一旦声明定义好,数组的长度就不会更改。如果想要在里面插入或者是删除元素都是实现不了的。但是可变数组可以进行这些更改操作。

1,不可变数组

Scala中的集合在进行动态声明和定义的时候可以不适用new关键字创建一个对象才能够进行相应的操作,我们只需要使用集合的类名即可。

1)静态声明

格式为:val  变量名【对象名】  =Array[Int](元素1,元素2,元素3)

代码:

scala> val array2=Array[Int](1,5,7)

结果:

2)动态声明

但是在进行动态声明和定义一个数组的时候就使用new关键字,因为如果不使用的话,虚拟机就会默认后面的小括号里面的参数为数组里面的元素。即我们在进行数组的动态声明时,需要使用到new关键字来调用类的构造方法进行创建,并且,我们只能够传入一个参数,就是数组的长度,但是之前我们的不可变数组【定长数组】调用的是Array的静态数组对象,可以向里面传入多个参数即多个数组的元素。

错误的动态声明【声明成了静态数组】:

scala> val array3=Array[Int](3)
array3: Array[Int] = Array(3)

如上只是声明了一个静态的数组,并且,第一个元素就是我们传进去的参数3。 

 正确的动态声明:

scala> val array001=new Array[Int](2)

 如上,我们可以看到,使用动态声明的数组里面的元素由虚拟机默认指定的数值。例如:

Int   :默认为0

String:默认为null

Bolean:默认为false

Float[Double]:默认为0.0

2,可变数组

可变数组和不可变数组的区别在于可变数组可以对数组的长度进行更改。需要注意的是,可变数组在使用的时候需要导入相关的包import scala.collection.mutable.ArrayBuffer。不然就无法识别到我们声明的ArrayBuffer类型的数组。之前我们已经知道了数组的动态和静态声明,接下来我们直接去动态声明一个可变数组,并对该数组进行改变,如:向数组中添加元素,达到改变数组长度的作用。

1)动态声明一个可变数组

在声明定义可变数组时,一定要记得导包: import scala.collection.mutable.ArrayBuffer

scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer

scala> var array001=ArrayBuffer(1,2,3,4)
array001: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4)

 创建好可变数组之后我们就可以使用append,insert函数向可变数组中添加数组元素。也可以使用+=函数进行添加多个元素。 

2)使用append函数向可变数组的末尾添加元素

append函数只能向可变数组的末尾追加元素,并且可以一次性追加多个元素。 

scala> var array001=ArrayBuffer(1,2,3,4)
array001: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4)

scala> array001.append(22,22)

scala> array001
res1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 22, 22)

 3)使用insert函数在可变数组的指定位置添加元素

insert函数可以实现在指定的数组索引位置插入元素,也可以一次性插入多个元素

一次只插入一个元素:

scala> array001
res1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 3, 4, 22, 22)

scala> array001.insert(0,1)  // 在可变数组的第一个位置插入一个元素:1

scala> array001
res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 1, 2, 3, 4, 22, 22)

一次插入多个元素:

scala> array001.insert(0,77,88)  //  在可变数组的第一个位置插入两个元素:77,88

scala> array001
res9: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(77, 88, 99, 100, 1, 2, 1, 1, 2, 3, 4, 22, 22)

scala>

 4)使用 +=函数在可变数组的末尾追加一个或多个元素

scala> array001 +=(44,55)  // 在可变数组中添加两个元素44,55
res10: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(77, 88, 99, 100, 1, 2, 1, 1, 2, 3, 4, 22, 22, 44, 55)

 5)使用++=函数在可变数组中添加同类型的数组

之前我们使用的+=函数只是向可变数组中添加多个参数而已,无法实现向数组中添加同类型数组:

scala> var array002 =new ArrayBuffer[Int](5)  // 动态声明定义一个长度为5的可变数组

 如上,我们可以看到,当我们还是使用之前的+=函数去往数组中添加数组类型的元素时,是行不通的。

现在我们使用++=函数去试试,它可以完成向数组中添加同类(序列)的作用吗?

 可以看到,这样的方法是可行的。但是因为array002数组是使用动态创建的,所以现在的效果不明显,我们可以使用++=函数,让array002可变数组添加array001数组中的所有元素:

scala> array002 ++= array001

 如上我们可以看到,之前动态创建的数组里面不是空的,而是有了其他的元素存在。

6)使用-=函数去指定删除数组中的元素(可以一次性删除多个元素)

我们可以向可变数组中添加元素,那么我们可以从可变数组中删除元素吗?当然可以。

我们可以使用   或者是-=函数,--=函数去删除想要删除的元素(不管该元素是位于元组中的哪一位置)

scala> array002 -=(99,22,44)

 如上,我们可以看到,我们可以删除数组中指定的元素,不管是它位于哪一个位置。

7)使用remove函数删除指定索引下标的元素(一次性删除多个)

现在我们有这么一个数组,接下来我们对里面的元素使用remove函数来删除:

ArrayBuffer(1, 2, 1, 1, 2, 3, 4, 22, 22, 44, 55) 

删除一个元素:


scala> array003
res41: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 1, 2, 3, 4, 22, 22, 44, 55)

scala> array003.remove(1)
res42: Int = 2

如上,我们可以看到,当我们使用remove函数只删除一个元素的话,会顺道将我们删除的元素在数组中的索引位置。

删除多个元素:

当我们使用remove函数去删除多个元素的时候,我们需要向里面传入两个参数,一个是起始删除的索引位置,第二个是要删除的元素个数,格式:remove(start_indext  Int,count  Int)  

接下来我们使用remove函数去删除多个元素:

原始数组:ArrayBuffer(1, 2, 1, 1, 2, 3, 4, 22, 22, 44, 55)

现在我们如果想要删除索引从2开始,长度为4所包含的元素,就可以如下编写代码:

scala> var array003=ArrayBuffer(1, 2, 1, 1, 2, 3, 4, 22, 22, 44, 55)
array003: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 1, 1, 2, 3, 4, 22, 22, 44, 55)

scala> array003.remove(2,4)

scala> array003
res1: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(1, 2, 4, 22, 22, 44, 55)

3,数组的相关方法

1)获取数组元素个数:size/获取数组长度:length

scala> array001.size   // size方法用于获取数组中的元素有几个
res0: Int = 3

scala> array001.length

 length方法和size方法一样,都可以用于返回数组中的元素个数或数组的长度。

2)修改数组元素【给数组元素赋值】array[index]=value

如下,我们可以通过,数组变量加中括号,并且在小括号里面指定要进行赋值或者是修改的元素的索引即可,实现修改或赋值,如果是在Java中的话数组的赋值和修改是需要数组变量加上中括号才行。在下面我们的将array001数组的第一个元素赋值(修改)为2003,并将这个数组进行返回,可以看到,在数组的第一个元素就是我们修改后的结果。

scala> array001(0)=2003

3)静态数组转换成动态数组array.toBuffer

如果想要将不可变的数组转换成可变数组的话可以使用toBuffer方法,该方法也可以在不想要使用循环语句的条件下进行查看数组:

scala> val array002=array001.toBuffer

 如上,我们可以看到使用另外一个变量接收转换后的数组为可变数组。

4)将Any类型类型的数组进行强转并取出里面的元素array.asInstanceOf[type]

 首先需要创建包含有多种数据类型的Array数组:

scala> val array004=Array(1,"张三",Array[Int](1,2,3))

现在我们去遍历数组的各个元素:

 

 例如想要取出Array[Int](1,2,3)中的第二个元素就会报错:

 但是如果我们使用强转,将Any类型的Array数组转换成Int类型的话就可以进行操作。需要使用的关键字为asInstanceOf:

scala> array004(2).asInstanceOf[Array[Int]]

 如上,我们可以看到,转换之后的数组返回的结果没有带有Any类型的表示,而是返回对应的元素。所以在类型为泛型的数组中如果想要对里面的元素进行处理,就需要进行强转处理。

5)获取数组中的最大数max

使用max函数就可以获取到数组中值最大的元素,并返回该元素:

scala> array002
res8: Array[Int] = Array(1, 4, 2, 5, 6, 7)

scala> array002.max
res9: Int = 7

6)获取数组中的最小数min

使用min函数就可以获取到数组中值最小的元素,并返回该元素:

scala> array002
res10: Array[Int] = Array(1, 4, 2, 5, 6, 7)

scala> array002.min
res11: Int = 1

7)数组翻转reverse

reserve方法可以用来翻转我们的数组,一般是该数组使用了sorted或者是sorteWith函数升序排序之后去调用,实现返回一个降序排序的数组的效果。如下我是直接返回该翻转后的数组: 

scala> array002
res15: Array[Int] = Array(1, 4, 2, 5, 6, 7)

scala>

scala> array002.reverse
res16: Array[Int] = Array(7, 6, 5, 2, 4, 1)

8)数组排序sorted

sorted方法可以用于对数组进行升序排序,得到一个元素是从小到大排序的数组: 

scala> array002
res4: Array[Int] = Array(1, 4, 2, 5, 6, 7)

scala> array002.sorted
res5: Array[Int] = Array(1, 2, 4, 5, 6, 7)

 9)遍历数组

我们在遍历数组的时候可以使用两种方式进行遍历,一种是直接取出数组中的元素并返回,另外一种是通过索引获取到元素之后再返回: 

scala> for(i <-0 until array002.size)print(s"${array002(i)}  ")  // 通过索引遍历数组
1  4  2  5  6  7    
scala> for(i <- array002)print(s"${i}  ")   // 直接获取到数组元素
1  4  2  5  6  7
scala> array002
res22: Array[Int] = Array(1, 4, 2, 5, 6, 7)   // 原数组

10)使用yield关键字对数组元素进行处理(全部)

在遍历数组元素的时候对元素进行自定义的处理(会对数组里面的全部数组进行一样的操作)并将处理后的元素放到一个新的数组中并返回该数组,如下,我们将遍历出来的数组元素都乘以10,并使用一个变量来存储新的数组:

scala> val array003=for(i <- array002)  yield i * 10
array003: Array[Int] = Array(10, 40, 20, 50, 60, 70)

11)给定长数组添加元素并返回新的数组   :+

scala> array001
res8: Array[Int] = Array(1, 2, 3)

scala> array001 :+1
res9: Array[Int] = Array(1, 2, 3, 1)

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

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

相关文章

Linux命令从入门到实战 ----进程管理

文章目录kill终止进程pstree查看进程树netstat网络状态和端口占用信息crontab定时任务进程(process): 是正在执行的一个程序或命令&#xff0c;每一个进程都是一个运行的实体&#xff0c;都有自己的地址空间&#xff0c;并占用一定的系统资源 服务(service)&#xff1a;启动之后…

深度学习 Day 18——利用卷神经网络实现猫狗识别 Ⅱ

深度学习 Day 18——利用卷神经网络实现猫狗识别 Ⅱ 文章目录深度学习 Day 18——利用卷神经网络实现猫狗识别 Ⅱ一、前言二、我的环境三、前期工作1、导入依赖项并设置GPU2、导入数据四、数据预处理1、加载数据2、检查数据3、配置数据集并进行归一化处理4、可视化数据五、构建…

xv6源码解析(三)——内存管理

01 内存管理 内存管理&#xff1a;通过编写物理页分配器&#xff0c;以链表管理所有空闲页帧&#xff0c; 实现了对物理页帧的回收与分配&#xff1b;在xv6系统sbrk内存管理方式的基础上&#xff0c;添加了进程用户空间非连续分区的分配。 内存管理参考链接 mmap 02 sbrk机制…

猿创征文|【Linux】Linux中的gdb调试器的使用

目录 一、什么是gdb&#xff1f; 二、gdb的安装 三、gdb的使用 1、只有debug版可以被调试 2、gdb的常用指令 2.1显示代码&#xff1a;l指令&#xff08;list指令&#xff09; 2.2设置断点&#xff1a;b指令&#xff08;break指令&#xff09; 2.3显示断点/禁用断点/开启…

Linux操作系统~进程fork到wait到底怎么用?

目录 1.fork() &#xff08;1&#xff09;.概念 &#xff08;2&#xff09;.fork的写时拷贝 &#xff08;3&#xff09;.fork常规用法 2.进程终止 &#xff08;1&#xff09;.进程退出场景/退出码 &#xff08;2&#xff09;.进程常见退出方法 1&#xff09;.exit函数 …

类与对象(中级)

目录 1. 包 1.1 包的概念 1.2 导入包中的类 1.3 自定义包 1.4 常见的包 2. Java三大特性 -- 封装 3. Java三大特性 -- 继承 3.1 继承的概念&#xff1a; 3.2 继承的语法 3.3 父类成员访问 3.3.1 子类中访问父类的成员变量 3.3.2 子类中访问父类的成员方法 4. supe…

数据挖掘(六) 层次聚类

数据挖掘&#xff08;六&#xff09; 层次聚类 1.层次聚类简介 层次聚类算法(Hierarchical Clustering)将数据集划分为一层一层的clusters&#xff0c;后面一层生成的clusters基于前面一层的结果。层次聚类算法一般分为两类&#xff1a; Divisive 层次聚类&#xff1a;又称自…

【nacos】5.1 spring cloud + Nacos 实现统一配置管理

1. 解决的问题&#xff1a; 配置动态更新配置集中式管理配置内容的安全性和权限不同部署环境下的配置 2. 环境&#xff1a; ideaspring cloudspring-cloud-alibaba nacosmavenmqtt &#xff08;客户端&#xff0c;服务器采用的是EMQ X 5.0 &#xff09; 3. pom依赖 3.1 父级…

皮卡丘python turtle海龟绘图(电力球版)附源代码

皮卡丘python turtle海龟绘图&#xff08;电力球版&#xff09;附源代码 本文目录&#xff1a; 一、皮卡丘python turtle海龟成品效果图 二、皮卡丘背景介绍 三、皮卡丘卡角色形象 四、愿你拥有一只皮卡丘 五、Python 海龟画图主要方法 &#xff08;1&#xff09;海龟画图…

Allegro在PCB上制作二维码和条形码操作指导

Allegro在PCB上制作二维码和条形码操作指导 当我们需要在PCB放置一个二维码或者条形码的时候,可以不需要额外去贴标签,可以直接在PCB上制作,如下图 制作出来的二维码和条形码是可以直接用扫码程序扫描的 具体操作步骤如下 首先要用was performance allegro productivity…

python Clickhouse 分布式表介绍和创建、插入和查询数据,以及解决遇到的问题

目录 一、分布式表和本地表 原理解析&#xff1a; 二、Clickhouse创建分布式表结构 三、python代码实现&#xff08;亲测有效&#xff09; 四、解决遇到的问题 解决 DB::Exception: Missing columns: wefgrgrfew while processing query: wefgrgrfew, required columns: …

【深度学习】第三章:卷积神经网络

文章目录1. 为什么要使用卷积神经网络&#xff1f;2. 卷积2.1 数学上的卷积2.2 深度学习的卷积3. 卷积的构成4. 卷积的特征5. 卷积的计算(1) 一维卷积计算(2) 二维卷积计算(黑白图片)(2) 三维卷积计算(彩色图片)6. 卷积的优势7. 卷积神经网络7.1 卷积层7.2 池化层7.3 全连接层8…

浅聊一下Nginx

目录 Nginx的下载与安装 去Nginx官网安装&#xff1a;nginx news 直接进入下载页面进行安装 直接安装&#xff1a; 在服务器上使用命令对nginx的安装过程 Nginx命令 Nginx配置文件结构 Nginx配置文件&#xff08;conf/nginx.conf&#xff09;正题分为三个部分&#xff1…

Vue框架的学习(Vue操作指令学习三 V-bind )第三课

Vue框架的学习(Vue操作指令学习三 V-bind )第三课 语法的学习关键在于实操 案例一 V-bind基本操作 通过这个案例了解基本的操作 <div id"app"><img src"./img/1-1 (1).jpg" alt""><!--! 绑定图片利用V-bind指令 --><img v-…

一本通1073;救援(c++)

#include <iostream> #include <cmath> using namespace std; int main() {// 屋顶数目、人数int n, m;// x坐标、y坐标、实际距离、所需时间double x, y, s, sum 0;cin >> n; // 输入屋顶数目for (int i 1; i < n; i){// 输入x、y坐标和人数cin >&g…

Rockland丨艾美捷Rockland大鼠γ-球蛋白说明书

艾美捷Rockland大鼠γ-球蛋白&#xff1a; 大鼠γ-球蛋白组分由含有全抗体和其他非白蛋白血浆蛋白的血清组分组成。丙种球蛋白可用于治疗&#xff0c;以暂时提高患者的免疫力&#xff08;如免疫抑制感染后&#xff09;或增加接受肾移植的可能性。γ-球蛋白级分可作为对照试剂用…

【问题记录与解决】jupyter notebook 无法重命名,无法运行测试代码 || jupyter notebook 中常用的两个快捷键。

可以回顾下之前遇到的小问题&#xff0c;因为这次的问题解决就有赖于之前记录的内容喔&#xff01; 一、问题记录与解决】启动Jupyter&#xff0c;运行代码时报错【Error】 || 通过 Jupyter 建立的Python文件在哪儿 || Jupyter 中 移动 Python 文件 到 指定文件夹 二、【记录】…

nosql期末

文章目录第一章 绪论选择判断题简答题1. NoSQL和关系型数据库在设计目标上有何主要区别&#xff1f;2. 简要总结一下NoSQL数据库的技术特点。第二章 NoSQL数据库的基本原理选择判断简答题1. 描述分布式数据管理的特点。2 什么是CAP原理&#xff1f;CAP原理是否适用于单机环境&a…

数据结构之顺序表

目录一、什么是顺序表二、顺序表的分类1、静态顺序表2、动态顺序表(重要)三、C语言实现顺序表1、顺序表的基本结构&#xff08;2&#xff09;、动态顺序表2、动态顺序表中常见的函数接口&#xff08;1&#xff09;、初始化&#xff08;2&#xff09;、销毁函数&#xff08;3&am…

Java:什么是Quarkus?

Quarkus是一个全栈Kubernetes原生Java框架&#xff0c;用于Java虚拟机(JVM)和原生编译&#xff0c;专门针对容器优化Java&#xff0c;使其成为无服务器、云和Kubernete环境的有效平台。 Quarkus旨在与流行的Java标准、框架和库(如Eclipse MicroProfile和Spring)以及Apache Kafk…