可变数组与不可变数组

43 阅读2分钟
object class37 {
  def main(args: Array[String]): Unit = {
    // 可变数组
    val arr1 = scala.collection.mutable.ArrayBuffer(1,2,3);
    // 可以直接添加元素
    arr1 += 4
    println(arr1)

    // 不可变数组
    val arr2 = Array(1,2,3)
    // 不可变,不能直接添加元素
    // arr2 += 4 //报错
    println(arr2)
  }
}
  1. 代码含义

    • arr1 是scala.collection.mutable.ArrayBuffer类型的可变数组;
    • ++= 是 Scala 中可变集合的 “批量追加” 运算符,此处尝试将(5,6,7)中的元素批量添加到arr1中。
  2. 潜在问题

    • 语法错误:(5,6,7)是元组,而++=要求右侧是 “可迭代对象”(如ArrayList),正确写法应为arr1 ++= Array(5,6,7)arr1 ++= Seq(5,6,7),直接写元组会导致类型不匹配错误
  3. 修复方式:将代码改为以下任一写法:

    scala

    // 方式1:使用Array作为可迭代对象
    arr1 ++= Array(5,6,7)
    // 方式2:使用Seq作为可迭代对象
    arr1 ++= Seq(5,6,7)
    **```**
    

    object class38 { def main(args: Array[String]): Unit = { // 可变数组 val arr1 = scala.collection.mutable.ArrayBuffer(1,2,3) // 添加 // arr1 += 4 arr1 ++= Array(5,6,7)

    // 删除
    // arr1 -= 4
    // 删除某个下标上的元素
    // arr1.remove(3)
    // arr1.remove(6, 3) // 从指定位置开始删除;删除几个?
    
    
    // 修改
    arr1(2) = 700
    
    // 判断是否存在?
    println( arr1.contains(6)) // true
    println( arr1.contains(9)) // false
    
    println(arr1.sum) // 求和
    arr1.foreach(ele=> println(ele))
    

    } }

    object class39 { def main(args: Array[String]): Unit = { // 可变数组 val arr1 = scala.collection.mutable.ArrayBuffer(1,2,0,-1,20,3)

    // 排序
    // val arr2 = arr1.sortWith((a,b)=>a>b)
    
    // 切片:只取整个数组中的某个部分 slice
    val arr3 = arr1.slice(0, 3)
    
    // 过滤
    // val arr4 = arr1.filter(x => x>0)
    
    // 按位置:检索某个元素的下标
    val target = -2
    val result = arr1.indexOf(target) // 如果没找到这个元素,就返回-1
    println(s"${target}的下标是 ${result}")
    
    arr4.foreach(ele=> println(ele))
    

    } }

image.png

代码示例

object class39 {
  // 定义样例类:封装梦想项的属性
  case class DreamItem(content: String, isDone: Boolean, deadline: String, prior: Int)

  def main(args: Array[String]): Unit = {
    // 1. 初始化3个梦想项,补全content字段(填充具体目标)
    val dream1 = DreamItem("完成Scala进阶学习", false, "2026-6-1", 1)
    val dream2 = DreamItem("考取阿里云高级认证", false, "2026-12-11", 2)
    val dream3 = DreamItem("完成个人项目开发", false, "2026-5-6", 3)

    // 2. 存入可变数组
    val dreamList = scala.collection.mutable.ArrayBuffer(dream1, dream2, dream3)

    // 3. 标记第一个梦想为「已完成」
    dreamList(0) = dreamList(0).copy(isDone = true)

    // 4. 可选:调整第三个梦想的优先级(解开注释即可生效)
    // dreamList(2) = dreamList(2).copy(prior = 0)

    // 5. 按优先级升序排序(数字越小优先级越高)
    val orderList = dreamList.sortBy(_.prior)

    // 6. 切片:只取前2个高优先级的梦想
    val newList = orderList.slice(0, 2)

    // 7. 遍历打印结果(格式化输出)
    newList.foreach(ele => {
      println(s"内容: ${ele.content}")
      println(s"状态: ${if (ele.isDone) "完成" else "未完成"}")
      println(s"截止日期: ${ele.deadline}")
      println(s"优先级: ${ele.prior}")
      println("--------------------------")
    })
    println()
  }
}