Scala中的Array详解:不可变与可变数组操作指南

40 阅读3分钟

一、导入

在编程过程中,我们经常需要存储和操作一组数据。比如,存储一个班级学生的成绩或者一个图像的像素值。在Scala中,Array是一种非常重要的数据结构,可以帮助我们有效地处理这类数据。今天我们就来深入学习Scala中的Array。

二、Array的定义与类型

Array是Scala中用于存储固定大小、相同类型元素的数据结构。它在内存中是连续存储的,这使得访问元素的速度非常快。Scala提供了两种类型的数组:

  • Array:表示长度不可变的数组
  • ArrayBuffer:表示长度可变的数组

三、不可变数组的基本操作

案例:不可变数组的创建与特点

package array

object array01 {
  def main(args: Array[String]): Unit = {
    val arr1 = scala.Array(1,2,3)
    // arr1 += 4; 不可变的数组,不能添加
    
    val arr2 = scala.collection.mutable.ArrayBuffer(1,2,3)
    arr2 += 4 // 可变数组,可以添加元素
    
    println(arr2)
  }
}

代码结果

1.png

代码分析

  1. 不可变数组的创建:使用scala.Array(1,2,3)创建不可变数组
  2. 不可变特性:注释掉的arr1 += 4说明了不可变数组不能添加元素
  3. 可变数组的创建:需要从scala.collection.mutable包中导入ArrayBuffer
  4. 可变特性arr2 += 4展示了可变数组可以动态添加元素
  5. 类型区分:明确展示了两种数组类型在创建和操作上的区别

四、可变数组的完整操作

案例:可变数组的增删改查操作

package array

object array02 {
  def main(args: Array[String]): Unit = {
    val arr2 = scala.collection.mutable.ArrayBuffer(1,2,3)

    // 1. 添加
    arr2 += (4,5) // 可变数组,可以添加元素

    // 2. 删除
    arr2 -= 2

    // 3. 获取指定下标的元素
    // arr2(0) 下标为0,数组中的第一个元素
    println(arr2(0))

    // 4. 修改
    arr2(0) = 100

    // 5. 遍历
    arr2.foreach(ele => println(ele))

    // println(arr2)
  }
}

代码结果

2.png

代码分析

  1. 创建可变数组:使用ArrayBuffer构造函数初始化数组
  2. 批量添加元素arr2 += (4,5)展示了如何一次性添加多个元素
  3. 删除元素arr2 -= 2删除值为2的元素
  4. 元素访问arr2(0)通过索引访问数组第一个元素
  5. 元素修改arr2(0) = 100修改指定位置的元素值
  6. 数组遍历:使用foreach方法遍历数组所有元素
  7. 操作顺序:代码展示了增、删、查、改、遍历的完整操作流程

五、数组常用操作方法

  1. 映射(Map)arr.map(f)对数组中的每个元素应用函数f,返回新的不可变数组
  2. 过滤(Filter):根据条件过滤数组元素
  3. 搜索和比较
    • arr.indexOf(elem):返回元素的第一个索引
    • arr.contains(elem):检查是否包含元素
  4. 切片(Slice)arr.slice(from, until)返回子数组

六、多维数组简介

多维数组最典型的是二维数组,类似于表格。有两种主要创建方式:

  • 直接定义Array.ofDim[Type](rows, cols)
  • 从一维数组转换:使用grouped()方法

七、总结

核心知识点回顾

  1. 数组类型选择

    • 使用Array创建不可变数组(大小和内容固定)
    • 使用ArrayBuffer创建可变数组(需要导入相应包)
  2. 基本操作

    • 创建:使用构造函数初始化
    • 访问:通过索引访问元素
    • 修改:可变数组支持元素值的修改
    • 增删:只有可变数组支持动态添加和删除元素
  3. 重要特性

    • 不可变数组更安全,适合函数式编程
    • 可变数组更灵活,适合需要动态调整的场景
    • 数组在内存中连续存储,访问速度快