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

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

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 {
  //不可变的Array
  def main(args: Array[String]): Unit = {
    val arr1 = Array(1,2,3)
    arr1(0) = 100
    arr1.foreach(println)
    //数组的常用的方法(对于可变和不可变的数组都可以使用)
    //1.截取。从源数组中,取一部分,组成一个新的数组
//    arr1.slice(起点下标,终点下标-不包括)
    val arr2 = arr1.slice(2,5)
    arr2.foreach(println)
    //2.遍历。foreach
    //3.映射 map
    Array(1,2,3)
    val arr3 = Array(1,2,3).map(e =>e*2)
    arr3.foreach(println)
    //4.过滤 filter
    println("-"*50)
    //留下奇数,组成一个新的数组
    val arr4 = Array(2,3,4,5,6).filter(e=> e%2 ==1)
    arr4.foreach(println)
    //5.折叠 reduce
    println(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))

    //9
    println(arr5(2)(2))
    //4
    println(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,iterator
    for(i <- arr1)println(i)
    println("-"*50)
    arr1.foreach(println)
    println("-"*50)
//    val it1 = arr1.iterator
//    while (it1.hasNext)
//      println(it1.next())
//  }

}


http://www.kler.cn/a/409149.html

相关文章:

  • 安宝特方案 | AR助力紧急救援,科技守卫生命每一刻!
  • IT服务团队建设与管理
  • 桥梁、隧道、道路、铁路、结构、岩土,哪个发展更好?
  • Spring Boot + ActiveMQ Artemis:快速实现高效消息队列处理功能
  • Java算法OJ(10)哈希表练习
  • Linux中,防火墙基本操作指令
  • 数据库、数据仓库、数据湖、数据中台、湖仓一体的概念和区别
  • Mac下的vscode远程ssh免密码登录
  • 【CVE-2024-9413】SCP-Firmware漏洞:安全通告
  • 【LLM训练】从零训练一个大模型有哪几个核心步骤?
  • 重装系统后ip地址错误,网络无法接通怎么办
  • C++设计模式-享元模式
  • C#13新特性介绍:LINQ 的优化设计
  • OpenMM的安装与使用
  • 2024小迪安全基础入门第二课
  • 基于python的机器学习(四)—— 聚类(一)
  • 鸿蒙开发Hvigor插件动态生成代码
  • YOLO-FaceV2: A Scale and Occlusion Aware Face Detector
  • Qt | 在Arm Qt上构建并运行一个本地Windows应用程序
  • 【C++】模拟实现 list:双向链表的构建与解析
  • NLP论文速读(MPO)|通过混合偏好优化提高多模态大型语言模型的推理能力
  • Linux常见的指令及shell外壳程序的理解
  • CSS实现实现当文本内容过长时,中间显示省略号...,两端正常展示
  • SplatFormer: Point Transformer for Robust3D Gaussian Splatting 论文解读
  • 学Linux的第九天--磁盘管理
  • 区块链中台详解(Fabric)