scala基础学习(数据类型)-数组

news2024/12/27 13:39:13

文章目录

  • 数组 Array
    • 创建数组
      • 直接定义
      • fill
      • ofDim
      • tabulate
    • range
    • 打印数组
      • toSeq
      • deep
      • foreach(println)
    • length获取长度
    • indexOf 获取元素索引
    • 获取元素/修改元素
    • 遍历数组
    • 数组内元素转换
    • filter 过滤
    • found 查找元素
    • 数组折叠 foldLeft
    • 切片
    • 拼接
    • 排序
    • 拷贝
      • copy
      • clone

数组 Array

  • Array是一个固定大小的集合,原数组上无法进行添加/删除操作,可以通过++,filter 生成新数组完成目的
  • 定义数组,通常数组内元素的数据类型是统一的,当你向数组中存储不同类型数据需要使用any对象
  • var 定义Array 修改的数组是因为变量重新指向了新数组的内存地址,并不是数组的修改
  • Array内的元素修改,并不是修改了Array地址,Array相当于容器,内部元素变了并不是容器变了。
  • 数组的索引为0~~(数组长度)-1,索引没有反向索引,只有正向的。

创建数组

直接定义

val ary:Array[Int] = Array(0,1,2,3)

fill

fill(int1,int2)(填充值)int1:维度,int2:元素数量

注意创建二维数组的时候如果声明变量需要按照二维数组声明

// 创建一维数组 
val ary1: Array[Int] = Array.fill(5)(0)

// 创建二维数组
val ary7 = Array.fill(2, 3)(0)
println(ary7.deep) //Array(Array(0, 0, 0), Array(0, 0, 0))

ofDim

Array.ofDim[Int](int1,int1) 作用通fill 但是填充值默认为0,(如果变量声明了类型ofDim可以不声明)

注意创建二维数组的时候如果声明变量需要按照二维数组声明

// 创建一维数组
val ary1 = Array.ofDim[Int](3)
println(ary1) //Array( 0, 0, 0)

// 创建二维数组 通fill
val arr1 = Array.ofDim[Int](5,3)
println(arr1.deep) 
//Array(Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0))

// 变量声明元素类型ofDim可以省去
val arr1:Array[Array[Int]] = Array.ofDim(5,3)

tabulate

创建数组,内容根据函数计算,可以创建1,2,3维度数组

Array.tabulate(int1,int2)(lambda)

//  tabulate,创建数组,元素根据函数计算
val arr4 = Array.tabulate(5)(n => n*n)  
println(arr4.deep)  //Array(0, 1, 4, 9, 16)
/*
0*0,1*1,2*2....
*/

// 创建二维数组 三行四列元素 相当于 i循环三次 创建三个arry
val arr5 = Array.tabulate(3,4)((i,j)=>i+j)
println(arr5.deep)
/*
i:0   j +0,1,2,3
i:1   j + 0 1 2 3
i:2   j +  0 1 2 3
i:3   ......
 */

range

range(s,e,n),s起始,e结束,n步长,只能取到e-1

val arr2 = Array.range(0, 10)
println(arr2.deep)  //Array(0,1,2...9)

val arr3 = Array.range(0, 10, 2)
println(arr3.deep)//Array(0,2,4,6,8)

打印数组

在scala中打印直接println数组得到的是内存地址,想要查看数组内容需要使用以下方法。

toSeq

转换为Seq类型,打印简单结构(只能打印第一层),如果是二维数组/嵌套结构使用toSeq会展示Array(内存地址1,内存地址2)

val ary:Array[Int] = Array(0,1,2,3)
println(ary.toSeq)
//WrappedArray(0,1,2,3)

val ary:Array[Array[Int]] = Array(Array(1,2,3),Array(1,2,3))
println(ary.toSeq)
//WrappedArray([I@724af044, [I@4678c730)

deep

递归打印,可以展示复杂结构,通用

val ary:Array[Array[Int]] = Array(Array(1,2,3),Array(1,2,3))
println(ary.deep)
//Array(Array(1, 2, 3), Array(1, 2, 3))

foreach(println)

foreach 一个遍历方法,结合println进行打印,效果同toSeq,也就只打印第一层,对于多维数组,或者嵌套结构会展示内存地址。

length获取长度

val ary:Array[Int] = Array(0,1,2,3)
println(ary.length) //4

indexOf 获取元素索引

indxeOf(目标元素,index位置)同python中的index

默认返回第一个出现元素的位置,当使用第二个参数会从指定索引后查询元素第一次出现的位置

val ary1 = Array(999, 1, 2,66, 3, 4,66)
println(ary1.indexOf(66)) //3

//从索引4开始查找,找到的一个66就是数组中的最后一个
println(ary1.indexOf(664)) //6

获取元素/修改元素

获取元素:ary.apply(index) 等价于 ary(index)

注意与python不同,不能直接在表达式上获取元素如:Array(0,1,2,3)(0)

val ary:Array[Int] = Array(0,1,2,3)
//效果一致
print(ary.apply(0));print(ary(0))

修改元素:ary(index) = new val

val ary:Array[Int] = Array(0,1,2,3)
ary[0] = 9999
println(ary) //(9999,1,2,3)

遍历数组

通常结合for循环使用

val ary:Array[Int] = Array(0,1,2,3)
for (a<-ary){println(a)}

数组内元素转换

// 使用map方法配合toString进行转换
val arrStr1 = ary.map(z=>z.toString)

//使用匿名变量  _ 代替 z=>z
val arrStr1 = ary.map(_.toString)

filter 过滤

//filter配合 匿名函数 n =>  n%2 == 0
val filterarr = ary.filter(n => n%2 == 0 )

//使用匿名变量 
val filterarr = ary.filter(_%2 == 0 )

found 查找元素

find 方法用于在集合中查找满足特定条件的第一个元素。它返回一个 Option 类型,该类型可以是 Some(包含满足条件的元素)或 None(如果没有元素满足条件)。

因此,当你使用 ary.find(n => n == 3) 时,如果数组 ary 中存在元素 3,那么 find 方法将返回 Some(3)。如果没有元素 3,那么它将返回 None

需要注意的是,find 方法返回的是元素本身,而不是元素的索引。如果你需要查找元素的索引,你可以使用 indexOf 方法。

getOrElse当获取不到元素时候,可以指定返回值,建议返回值与预期返回类型一致避免类型冲突。

val ary: Array[Int] = Array(0, 1, 2, 3)
// 查找元素 found_ary  返回元素本身
val found_ary = ary.find(n => n == 3)
println(found_ary)  //Some(3) 

// 查询不到返回None
val found_ary2 = ary.find(n => n == 999)
println(found_ary2)  //None

// 当找不到899返回66 getOrElse类型可以与正常返回不一致,不建议
val found_ary3= aryzz.find(n => n == 899).getOrElse(66)

// 匿名函数写法
val found_ary = ary.find(_==3)

数组折叠 foldLeft

类似python reduct

在 Scala 中,foldLeft 方法是一个高阶函数,用于通过某种操作将集合中的所有元素组合(或折叠)成单个值。foldLeft 方法接受两个参数:一个初始值(称为“零值”),以及一个二元操作函数。

ary.foldLeft(0)(_ + _) 的作用是将数组 ary 中的所有元素与初始值 0 进行加法操作,并将结果累积起来。这里的 _ + _ 是一个匿名函数,它接受两个参数并返回它们的和。

具体来说,foldLeft 方法的工作方式如下:

  1. 它从数组的第一个元素开始,将其与初始值(这里是 0)一起传递给二元操作函数(这里是 _ + _)。
  2. 然后,它将操作的结果与数组的下一个元素一起传递给二元操作函数。
  3. 这个过程会一直持续,直到数组中的所有元素都被处理完毕。

fold 方法是 foldLeftfoldRight 的通用版本。它接受一个初始值和一个二元操作函数,并返回一个累积的结果。fold 方法的行为与 foldLeft 相同,因为它默认从集合的头部开始。

// 数组求和,积
val sum = ary.foldLeft(0)(_+_)
val product = ary.foldLeft(0)(_*_)
println(sum,product)

// 不用匿名函数
val sum = ary.foldLeft(0)((a,b)=>a+b)

切片

array.slice(start,end),只能取到end-1

// 数组切片
val ary:Array[Int] = Array(0,1,2,3)
val new_ary = ary.slice(0,2)
println(new_ary.toSeq) //(0,1)

拼接

new_ary = Array.concat(ar1,ar2) == ar1+ar2

// 数组拼接  ++ 相当于  Array.concat(ary,Array(7,8,9))
val newarry = ary++Array(7,8,9)
val newarry2 =  Array.concat(ary,Array(7,8,9))
println(newarry.toSeq)

排序

升序 ary.sorted,降序:ary.sorted(Ordering[Int].reverse)

//排序
val ary1 = Array(999, 1, 2,66, 3, 4)
val ary1_sord = ary1.sorted
println(ary1_sord.toSeq) //WrappedArray(1, 2, 3, 4, 66, 999)、


// 逆序排序
ary1.sorted(Ordering[Int].reverse)

reverse翻转

//反转与顺序无关
val reversedary = ary.reverse
println(reversedary.toSeq) //WrappedArray(4, 3, 66, 2, 1, 999)

拷贝

在 Scala 中,对于基本类型的数组(如 Int、Double、Char 等),深拷贝通常不需要特别处理,因为基本类型是不可变的。但是,对于包含对象引用的数组,你需要手动实现深拷贝,确保数组中的每个对象都被正确地复制。

copy

浅copy

copy(原数组,被copy起始位置,目标数组,copy到起始位置,copy长度)

//源数组(被copy)
val ary: Array[Int] = Array(0,1,2,3)

//创建目标数组(copy到这里)
val new_copyarray2 = Array.fill(ary.length)(0)

//数据copy
val new_copyarray3 = Array.copy(ary,0,new_copyarray2,0,ary.length)

clone

浅copy

val new_copyarray3 = ary.clone()
println(new_copyarray3.toSeq)

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

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

相关文章

Excel中一次查询返回多列

使用Excel或wps的时候&#xff0c;有时候需要一次查询返回多列内容&#xff0c;这种情况可以选择多次vlookup或者多次xlookup&#xff0c;但是这种做法费时费力不说&#xff0c;效率还有些低下&#xff0c;特别是要查询的列数过多时。我放了3种查询方法&#xff0c;效果图&…

智能化军事【五】精确制导武器智能化实现

文章目录 前言精确制导武器智能化实现基于深度学习实现的智能化功能基于强化学习实现的智能化功能强化学习深度强化学习 网络模型轻量化网络剪枝&#xff08;通道剪枝&#xff09;技术层剪枝权值量化技术低秩近似技术知识蒸馏技术强化学习联合训练 解决有效训练样本不足或获取困…

解锁高效密码:适当休息,让学习状态满格

一、“肝帝” 的困境 在当今竞争激烈的职场中&#xff0c;“肝帝” 现象屡见不鲜。超长工时仿佛成为了许多行业的 “标配”&#xff0c;从互联网企业的 “996”“007”&#xff0c;到传统制造业的轮班倒、无休无止的加班&#xff0c;员工们的工作时间被不断拉长。清晨&#xff…

asp.net 高校学生勤工俭学系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php python(flask Django) 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找…

WebRTC服务质量(12)- Pacer机制(04) 向Pacer中插入数据

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

RTMW:实时多人2D和3D 全人体姿态估计

单位&#xff1a;上海AI实验室 代码&#xff1a;mmpose/tree/main/projects/rtmpose 系列文章目录 RTMO: 面向高性能单阶段的实时多人姿态估计 目录 系列文章目录摘要一、背景二、相关工作2.1 自上而下的方法。2.2 坐标分类。2.3 3D Pose 3 实验方法3.1.1 任务限制3.1.3训练技…

AI智能养站神器-SEO助理原创文章批量生成发布工具

很多站长最头疼的就是网站每天的内容更新&#xff0c;因为不知道写什么&#xff0c;采集被人的文章又会被定义为抄袭&#xff0c;而且现在伪原创已经没有多大的效果了&#xff0c;所以今天给大家分享的就是一款AI智能养战神器-SEO助理原创文章批量生成发布工具。 这款工具支持…

用Python开启人工智能之旅(三)常用的机器学习算法与实现

第三部分&#xff1a;常用的机器学习算法与实现 用Python开启人工智能之旅&#xff08;一&#xff09;Python简介与安装 用Python开启人工智能之旅&#xff08;二&#xff09;Python基础 用Python开启人工智能之旅&#xff08;三&#xff09;常用的机器学习算法与实现 用Pyt…

FD(File Descriptor)泄漏

File Descriptor是Linux下概念&#xff0c;fd 是 int类型非负数&#xff01; 进程打开File&#xff0c;Socket&#xff0c;Pipe后生成一个File Descriptor&#xff0c;它是打开这个系统资源的标识符。 Linux每个进程fd最大1024个&#xff0c;超过之后进程 crash&#xff0c;c…

英语单词拼读小程序开发制作介绍

英语单词拼读小程序开发制作介绍本英语单词拼读小程序系统开发的主要功能有&#xff1a; 1、按年级分类展示每个年级阶段的英语单词信息。 2、点击选择的单词进入单词拼读页面&#xff0c;展示英语单词的拼读音标、中文意思、单词发音、拆分词汇发音、用户通过朗读发音对比。通…

TCP客户端模拟链接websocket服务端发送消息(二)

兄弟们&#xff0c;我来填坑了&#xff0c;o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o&#xff0c;前几天写了个tcp模拟websocket客户端的以为完成&#xff0c;后面需要发送消息给服务端&#xff0c;以为简单不就是一个发送消息么&#xff0c;这不是一…

Docker 镜像加速访问方案

在数字化时代&#xff0c;Docker以其轻量级和便捷性成为开发者和运维人员的首选容器技术。然而自2023年5月中旬起&#xff0c;Docker Hub 的访问速度较慢或不稳定&#xff0c;这对依赖Docker Hub拉取镜像的用户来说无疑是一个挑战。本文将提供 Docker Hub 访问的一系列替代方案…

牛客网刷题 ——C语言初阶——BC112小乐乐求和

1.牛客网刷题 ——C语言初阶 牛客网&#xff1a;BC112小乐乐求和 小乐乐最近接触了求和符号Σ&#xff0c;他想计算的结果。但是小乐乐很笨&#xff0c;请你帮助他解答。 输入描述: 输入一个正整数n (1 ≤ n ≤ 109) 输出描述: 输出一个值&#xff0c;为求和结果。 示例1 输…

Eclipse常用快捷键详解

文章目录 Eclipse常用快捷键详解一、引言二、编辑快捷键三、选择和移动快捷键四、行操作快捷键五、搜索和导航快捷键六、调试快捷键七、重构快捷键八、其他快捷键九、使用案例场景一&#xff1a;代码编写代码示例 场景二&#xff1a;代码调试场景三&#xff1a;代码重构代码示例…

clickhouse测试报告

​一、背景 针对当前实施的项目&#xff0c;面临着两个主要挑战&#xff1a;一是需要存储更详细的原始数据和中间数据&#xff0c;二是现有基于MySQL的数据存储解决方案在数据量增长时性能受限&#xff0c;特别是在进行跨年历史数据的即时分析时。为了解决这些问题&#xf…

windows和mac共享文件夹访问教程

mac共享文件夹&#xff0c;windows访问&#xff1a; mac上开启文件夹共享&#xff0c;并添加文件夹和用户&#xff0c;然后windows 上 在windows上快捷键 win r 打开运行&#xff0c;按如下格式输入mac设备的IP地址&#xff1a; 就可以访问了&#xff1a; windows共享文件夹…

FPGA自学之路:到底有多崎岖?

FPGA&#xff0c;即现场可编程门阵列&#xff0c;被誉为硬件世界的“瑞士军刀”&#xff0c;其灵活性和可编程性让无数开发者为之倾倒。但谈及FPGA的学习难度&#xff0c;不少人望而却步。那么&#xff0c;FPGA自学之路到底有多崎岖呢&#xff1f; 几座大山那么高&#xff1f;…

两分钟掌握 TDengine 全部写入方式

1. 背景 TDengine 写入过程会涉及很多概念&#xff0c;这些概念目前你是不是还一团乱&#xff0c;参数绑定写入、无模式写入、websocket 写入、RESTFUL 写入 、各种连接器写入等等一堆的写入&#xff0c;都是做什么的&#xff0c;不明白&#xff0c;这里花两分钟时间给你彻底整…

GJB289A总线典型网络理论分析

1.GJB289A总线典型网络理论分析 根据相关标准&#xff0c;“某个支路的故障不影响整个系统”及耦合变压器特性&#xff0c;本文在仿真与实测时均采用典型的一发一收两端口总线网络。 典型两端口总线网络电气结构如图1所示&#xff0c;包含终端匹配电阻、故障隔离电阻、耦合变…

BLE core 内容整理解释

本文内容比较杂散&#xff0c;只是做记录使用&#xff0c;后续会整理的有条理些 link layer 基本介绍 **Link Layer Control&#xff08;链路层控制&#xff09;**是蓝牙低功耗&#xff08;BLE&#xff09;协议栈的核心部分&#xff0c;负责实现设备间可靠、安全、低功耗的数…