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

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

文章目录

  • 数组 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)

相关文章:

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

文章目录 数组 Array创建数组直接定义fillofDimtabulate range打印数组toSeqdeepforeach(println) length获取长度indexOf 获取元素索引获取元素/修改元素遍历数组数组内元素转换filter 过滤found 查找元素数组折叠 foldLeft切片拼接排序拷贝copyclone 数组 Array Array是一个…...

uniapp 微信小程序 页面部分截图实现

uniapp 微信小程序 页面部分截图实现 ​ 原理都是将页面元素画成canvas 然后将canvas转化为图片&#xff0c;问题是我页面里边本来就有一个canvas&#xff0c;ucharts图画的canvas我无法画出这块。 ​ 想了一晚上&#xff0c;既然canvas最后能转化为图片&#xff0c;那我直接…...

C语言从入门到放弃教程

C语言从入门到放弃 1. 介绍1.1 特点1.2 历史与发展1.3 应用领域 2. 安装2.1 编译器安装2.2 编辑器安装 3. 第一个程序1. 包含头文件2. 主函数定义3. 打印语句4. 返回值 4. 基础语法4.1 注释4.1.1 单行注释4.1.2 多行注释 4.2 关键字4.2.1 C语言标准4.2.2 C89/C90关键字&#xf…...

直流无刷电机驱动原理3-驱动板硬件设计

六步换向原理 检测转子角度,知道什么时候是60度,什么时候应该换向。 逆时针旋转 三相逆变器,mos管,半桥驱动电路。 PWM调制 不对称半桥调制例程使用第(2)种。对上桥臂PWM调制,下桥臂全部导通。这时候由上桥臂的PWM的占空比决定电机的旋转速度。驱动器电路硬件框图--实…...

攻防世界web第三题file_include

<?php highlight_file(__FILE__);include("./check.php");if(isset($_GET[filename])){$filename $_GET[filename];include($filename);} ?>惯例&#xff1a; 代码审查&#xff1a; 1.可以看到include(“./check.php”);猜测是同级目录下有一个check.php文…...

Trivy Operator命令使用说明

你已成功安装了 Trivy Operator&#xff0c;以下是命令的使用说明&#xff1a; 1. 查看 VulnerabilityReports VulnerabilityReports 是 Trivy Operator 生成的漏洞扫描报告&#xff0c;用于检查容器镜像中的漏洞。 kubectl get vulnerabilityreports --all-namespaces -o wi…...

Lazada商品评论API接口:深度解析与应用实践

在电商领域&#xff0c;用户评论是了解产品市场表现和消费者反馈的重要渠道。Lazada作为东南亚领先的电商平台&#xff0c;提供了商品评论API接口&#xff0c;允许第三方开发者获取平台上商品的评论信息。本文将深入解析Lazada商品评论API接口的重要性、开发应用、以及如何通过…...

2024最新鸿蒙开发面试题合集(二)-HarmonyOS NEXT Release(API 12 Release)

上一篇面试题链接&#xff1a;https://mp.csdn.net/mp_blog/creation/editor/144685078 1. 鸿蒙简单介绍和发展历程 HarmonyOS 是新一代的智能终端操作系统&#xff0c;为不同设备的智能化、互联与协同提供了统一的语言。带来简洁&#xff0c;流畅&#xff0c;连续&#xff0…...

macrodroid通过http请求控制手机运行宏

macrodroid adb命令 adb shell pm grant com.arlosoft.macrodroid android.permission.WRITE_SECURE_SETTINGS例:http请求手机播放指定MP3文件 声音素材_电量过低提醒 新建一个宏 添加触发器-连接-http服务器请求 路径随意填,最好不要有特殊符号,不然浏览器识别链接会出错,…...

【Unity3D】Jobs、Burst并行计算裁剪Texture3D物体

版本&#xff1a;Unity2019.4.0f1 PackageManager下载Burst插件(1.2.3版本) 利用如下代码&#xff0c;生成一个Texture3D资源&#xff0c;它只能脚本生成&#xff0c;是一个32*32*32的立方体&#xff0c;导出路径记得改下&#xff0c;不然报错。 using UnityEditor; using Uni…...

Cesium材质——Material

简介&#xff1a; Cesium.Material对象的目的&#xff0c;就是生成一段名称为czm_getMaterial的函数&#xff08;示例代码如下&#xff09;&#xff0c; 这个czm_getMaterial函数&#xff0c;是shader代码&#xff0c;会被放到片元着色器中使用。 czm_material czm_getMater…...

Postman请求报错SSL证书验证问题

1.报错如下 2.解决报错...

终章:DevOps实践总结报告

DevOps实践总结报告 一、概述 1. 报告目的 本报告旨在总结DevOps实践中的关键领域、最佳实践和实施成果&#xff0c;包括需求管理、持续集成/持续部署、测试管理、安全管理和效能度量等方面。 2. 覆盖范围 #mermaid-svg-L0xFFzMbiDH1qhbl {font-family:"trebuchet ms&…...

解锁金融新纪元:内部知识库的深度挖掘与战略价值

在日新月异的金融行业中&#xff0c;信息的快速流通与精准决策成为了企业竞争力的核心。随着大数据、人工智能等技术的不断渗透&#xff0c;金融机构开始意识到&#xff0c;内部知识库的深度挖掘不仅是提升业务效率的关键&#xff0c;更是推动行业创新与转型的重要驱动力。本文…...

【c语言】一维数组与二维数组

数组 数组名代表的是数组在内存中的起始位置&#xff0c;即首元素的地址&#xff0c;而下表表示的则是该元素相对数组起始位置的偏移量 一维数组 1.定义 类型名 数组名[数组长度] int a[100]; //整型数组长度为101&#xff0c;数组名为a char b[100];//字符型数组长度为101&…...

Milvus×EasyAi:如何用java从零搭建人脸识别应用

如何从零搭建一个人脸识别应用&#xff1f;不妨试试原生Java人工智能算法&#xff1a;EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括&#xff1a; EasyAi&#xff1a;人脸特征向量提取Milvus&#xff1a;向量数据库用于高效存储和检索数据。 01. EasyAi&#xff1a;…...

Dockerfile 实战指南:解锁高效容器化开发

一、Dockerfile 简介 Dockerfile 是构建镜像的文本文件&#xff0c;通过一系列指令描述镜像构建过程&#xff0c;构建操作由 Docker daemon 进行&#xff0c;它会先验证语法&#xff0c;然后逐一运行指令&#xff0c;每次生成一个新的镜像层&#xff0c;直到构建出最终的镜像。…...

【每日学点鸿蒙知识】混淆配置、主线程处理大量数据、客户端拖拽效果、三方网站加载样式、List警告问题

1、HarmonyOS API升级之后缺少混淆配置文件&#xff1f; 可参考以下文档&#xff1a; 混淆配置&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-build-obfuscation-V5 混淆规则&#xff1a;https://gitee.com/openharmony/arkcompiler_ets…...

ChatGPT-4助力学术论文提升文章逻辑、优化句式与扩充内容等应用技巧解析。附提示词案例

目录 1.扩写&#xff08;expansion/paraphrasing&#xff09; 2.优化&#xff08;optimization&#xff09; 3.缩写&#xff08;optimization&#xff09; 4.提取关键词&#xff08;keyword extraction&#xff09; 5.短语转换&#xff08;phrase transformation&#xff…...

Android TextView 添加图标并实现换行

图文混排。 binding.apply {val spannable = SpannableString(" " + "Kotlin 是 Android 官方推荐的编程语言。")val drawable: Drawable = ContextCompat.getDrawable(this@DemoMainXmlActivity,R.mipmap.ic_title_d)!!drawable.setBounds(0, 0, drawabl…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

SQL注入篇-sqlmap的配置和使用

在之前的皮卡丘靶场第五期SQL注入的内容中我们谈到了sqlmap&#xff0c;但是由于很多朋友看不了解命令行格式&#xff0c;所以是纯手动获取数据库信息的 接下来我们就用sqlmap来进行皮卡丘靶场的sql注入学习&#xff0c;链接&#xff1a;https://wwhc.lanzoue.com/ifJY32ybh6vc…...

当下AI智能硬件方案浅谈

背景&#xff1a; 现在大模型出来以后&#xff0c;打破了常规的机械式的对话&#xff0c;人机对话变得更聪明一点。 对话用到的技术主要是实时音视频&#xff0c;简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术&#xff0c;开发自己的大模型。商用方案多见为字节、百…...