Scala的Array和ArrayBuffer集合及多维数组

ops/2024/11/22 22:47:41/

ArrayBuffer是一个可变的序列集合,它可以通过添加和删除元素来动态改变其大小。它可以用于代替传统的数组,提供更多的操作和灵活性
特点:

动态大小:ArrayBuffer的大小可以根据需要进行自动调整,因此它可以包含任意数量的元素,而不需要提前定义大小。

可变性:ArrayBuffer是可变的,即可以在创建后添加、删除或更新元素。

平均插入/删除时间复杂度为O(1):向ArrayBuffer中添加或删除元素的平均时间复杂度为O(1),因为它会自动调整内部数组的大小。

Array是Scala中的原生数组,它具有固定大小并且大小在创建后无法更改。与其他集合类型不同,Array的大小在编译时确定。

特点:

固定大小:Array在创建时需要指定大小,一旦创建后就无法更改。

不可变性:Array是不可变的,即不支持添加、删除或更新元素。但是,可以通过重新赋值来更新Array中的元素。

平均访问时间复杂度为O(1):由于Array的元素在内存中是连续存储的,因此通过索引访问元素的平均时间复杂度为O(1)。

多维数组:

最典型的多维数组就是二维数组,类似于表格。有两种定义方式:
直接定义:Array.ofDim (x,y)
从一维数组转化得来:数组. grouped ()

package Test
import scala.collection.mutable.{ArrayBuffer, ArrayStack}
//Array:数组
//可修改的:ArrayBuffer
//不可修改的:Array
object day12 {//不可变的Arraydef main(args: Array[String]): Unit = {val arr1 = Array(1,2,3)arr1(0) = 100arr1.foreach(println)//数组的常用的方法(对于可变和不可变的数组都可以使用)//1.截取。从源数组中,取一部分,组成一个新的数组
//    arr1.slice(起点下标,终点下标-不包括)val arr2 = arr1.slice(2,5)arr2.foreach(println)//2.遍历。foreach//3.映射 mapArray(1,2,3)val arr3 = Array(1,2,3).map(e =>e*2)arr3.foreach(println)//4.过滤 filterprintln("-"*50)//留下奇数,组成一个新的数组val arr4 = Array(2,3,4,5,6).filter(e=> e%2 ==1)arr4.foreach(println)//5.折叠 reduceprintln(Array(1,2,3,4).reduce((a,b)=>a+b))println("-"*50)//多维数组val arr5 = Array(Array(1,2,3),Array(4,5,6),Array(7,8,9))//9println(arr5(2)(2))//4println(arr5(1)(0))println("-"*50)//创建二维数组
//    val arr6 = Array.ofDim[Int](3,3,3)
//    arr6(0)(0)(0)=1//由一维数组转化得到二维数组val arr6 = Array(1,2,3,4,5,6).grouped(3)//对数组中的元素,3个为一组,升级为二维数组while (arr6.hasNext){var rs =arr6.next()println(rs(0))}}//可修改的:ArrayBuffer
//  def main(args: Array[String]): Unit = {
//    //1.新建
//    val arr1 = ArrayBuffer(1,2,3)
//    //2.添加
//    arr1 += 4
//    arr1.insert(0,100)
//    //3.删除
//    arr1 -= 3//删除指定的元素
//    arr1.remove(0)//删除指定位置(下标)的元素
//    //4.修改.通过下标来修改
//    arr1(0)=50//把下标为0的元素值为50
//
//    //注意:下标不能越界。有效的范围是:0-长度-1
//    println(arr1.length)//length 长度,用来获取元素的个数
//    println(arr1(1))//IndexOutOfBoundsException
//    //5.查询
//    //5.1判断某个元素在数组中是否存在
//    println(s"50在数组中吗? ${arr1.contains(50)}")
//    //5.2 找到指定元素的下标
//    //  -1:表示某个元素在数组中不存在
//    println(s"500在数组中的下标是:${arr1.indexOf(500)}")
//    //6.遍历for,foreach,iteratorfor(i <- arr1)println(i)println("-"*50)arr1.foreach(println)println("-"*50)
//    val it1 = arr1.iterator
//    while (it1.hasNext)
//      println(it1.next())
//  }}


http://www.ppmy.cn/ops/135905.html

相关文章

跨平台WPF框架Avalonia教程 十四

DataGrid 数据表格 数据表格以自定义的网格形式展示重复的数据。该控件可以进行样式定制、模板化和绑定。 数据表格需要绑定到一个可观察的集合&#xff08;Observable Collection&#xff09;&#xff0c;该集合可以在相关的数据上下文中找到。 信息 要了解数据上下文背后…

C# 面向对象的接口

接口&#xff0c;多态性&#xff0c;密封类 C# 接口 遥控器是观众和电视之间的接口。 它是此电子设备的接口。 外交礼仪指导外交领域的所有活动。 道路规则是驾车者&#xff0c;骑自行车者和行人必须遵守的规则。 编程中的接口类似于前面的示例。 接口是&#xff1a; APIsC…

资产管理运营系统mobilefront2前台文件上传漏洞

免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…

【Swift】运算符

文章目录 术语赋值运算符算数运算符基本四则算术运算符求余运算符一元负号运算符一元正号运算符 比较运算符三元运算符空合运算符区间运算符闭区间运算符半开区间运算符单侧区间运算符 逻辑运算符逻辑非运算符逻辑与运算符逻辑或运算符逻辑运算符组合计算 位运算符运算符优先级…

vue3的宏到底是什么东西?

前言 从vue3开始vue引入了宏&#xff0c;比如defineProps、defineEmits等。我们每天写vue代码时都会使用到这些宏&#xff0c;但是你有没有思考过vue中的宏到底是什么&#xff1f;为什么这些宏不需要手动从vue中import&#xff1f;为什么只能在setup顶层中使用这些宏&#xff…

【论文阅读】Adversarial Examples for Handcrafted Features

一篇针对SLAM中图像特征匹配的攻击方法 一、攻击定义 这篇论文的目的是设计一种方法&#xff0c;使得图像在被攻击之后能够在尽可能不影响外观的情况下&#xff0c;干扰匹配的过程。针对这个目标&#xff0c;作者首先指出了对于这篇文章&#xff0c;什么是一个成功的攻击。这…

RedHat Linux服务器Redis三主三从集群部署(普通用户启动)

一、安装redis&#xff1a; 先查看是否安装c的编译器&#xff1b; 执行 sudo yum -y install gcc-c(否则直接安装redis没依赖环境&#xff09; 第一步&#xff1a;上传安装包 第二步&#xff1a;在/mpjava路径下解压sudo tar -zxvf redis-6.2.5.tar.gz 第三步&#xff1a;进入 …

【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View

Android Java 自定义View 步骤 创建一个新的Java类&#xff0c;继承自View、ViewGroup或其他任何一个视图类。 如果需要&#xff0c;重写构造函数以支持不同的初始化方式。 重写onMeasure方法以提供正确的测量逻辑。 重写onDraw方法以实现绘制逻辑。 根据需要重写其他方法&…