玩转 Scala 数组

50 阅读2分钟

Scala 作为一门融合了面向对象与函数式编程的语言,其数组体系既保留了对传统不可变数组的支持,也提供了灵活的可变数组工具。

一、Scala 数组的两种核心类型

Scala 中的数组主要分为两类,分别适配不同的业务场景:

1. 不可变数组(scala.Array)

Scala 默认的Array是不可变的 —— 一旦创建,长度和元素都无法修改,适合数据固定、无需变更的场景。

完整代码实现


package array

object array01 {

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

}

二、ArrayBuffer 核心操作详解

可变数组ArrayBuffer的核心操作覆盖增、删、改、查、遍历,是处理动态数据的基础:

完整代码实现

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)
  }
}

三、实战:梦想清单管理系统

掌握基础操作后,我们通过一个「梦想清单管理」案例,将 ArrayBuffer 与 Scala 样例类结合,实现更贴近实际开发的场景。

需求说明

  1. 定义「梦想项」样例类,包含内容、完成状态、截止日期、优先级;
  2. 用 ArrayBuffer 存储梦想列表,支持添加、修改状态、调整优先级;
  3. 按优先级排序,提取前 5 个高优先级梦想并格式化输出。

完整代码实现

object array03 {
  // 定义梦想
case class DreamItem(content: String, isDone: Boolean, deadline: String, prior: Int)

object DreamListManager {
  def main(args: Array[String]): Unit = {
    // 2. 定义可变ArrayBuffer存储梦想
    import scala.collection.mutable.ArrayBuffer
    val dreamList = ArrayBuffer[DreamItem]()

    // 3. 添加3个梦想
    dreamList += DreamItem("学习Scala框架", false, "2027-03-15", 2)
    dreamList += DreamItem("阅读100本书", false, "2026-12-30", 1)
    dreamList += DreamItem("完成200m跑步达标", false, "2026-09-01", 3)

    // 4. 将第2个梦想设为已完成(下标从0开始,第2个对应下标1)
    dreamList(1) = dreamList(1).copy(isDone = true)

    // 5. 调高第3个梦想的优先级(下标2)
    dreamList(2) = dreamList(2).copy(prior = 5)

    // 6. 按优先级从高到低排序
    val sortedDreams = dreamList.sortBy(_.prior).reverse

    // 7. 保存优先级前5的梦想至新列表
    val top5Dreams = sortedDreams.take(5)

    // 8. 循环输出梦想列表
    println("整理后的梦想清单:")
    top5Dreams.foreach { item =>
      println(s"内容:${item.content} | 状态:${if(item.isDone) "已完成" else "未完成"} | 截止期:${item.deadline} | 优先级:${item.prior}")
    }
  }
}