scala中的Array

一.Array的定义

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

类型有两种:Array表示长度不可变的数组 和 ArrayBuffer表示长度可变的数组

二.不可变数组

Array表示长度不可变的数组,一旦定义之后,不能再增加,删除元素。

常规操作:创建数组,访问元素,填充Array.range

  1. 创建不可变数组
  2. 访问元素: 注意不要越界(越界会)
  3. 获取数组的长度:arr.length:获取数组的长度。
scala 复制代码
package array

/**
 * Array 和 List 的区别
 *
 * array:有序,数组:元素在空间上连续,通过下标去访问元素会特别快!
 * List:有序,链表:元素在空间上不连续
 *
 * 两种类型
 * 1.可变
 * 2.不可变:一个数组创建之后,不能添加,不能删除!
 *
 * 常用方法:添加,删除,查找,循环,排序,.....
 */

object array01 {
  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)
    // 不可变数组不能直接修改,拼接生成新数组
    // val arr2 = arr2 :+ 4
    println(arr2)
  }
}

三.可变数组

Array表示长度不可变的数组,一旦定义之后,不能再增加,删除元素。

  1. 新建。要先导入 ArrayBuffer。 可变的数据结构都需要额外导入
  2. 访问修改。数组名(下标)=新值。
  3. 添加元素
  • 添加一个元素;+= 元素
  • 添加多个元素;+=(元素1, 元素2)
  1. 删除元素
  • (1) 删除一个元素: -= 元素
  • (2) 删除多个元素: -= (元素1, 元素2)
  • (3) 删除指定位置的元素: remove(下标)
  • (4) 删除指定位置的多个元素:remove(下标起点,下标终点)
scala 复制代码
package array

/**
 * Array 和 List 的区别
 *
 * array:有序,数组:元素在空间上连续,通过下标去访问元素会特别快!
 * List:有序,链表:元素在空间上不连续
 *
 * 两种类型
 * 1.可变
 * 2.不可变:一个数组创建之后,不能添加,不能删除!
 *
 * 常用方法:添加,删除,查找,循环,排序,.....
 */

object array03 {
  def main(args: Array[String]): Unit = {
    // 创建1到99的数组(左闭右开)
    val arr = Array.range(1, 100)
    arr.foreach(println) // 打印1-99

    // 创建1到99、步长为3的数组
    val arr1 = Array.range(1, 100, 3)
    arr1.foreach(println) // 打印1、4、7...97

    // 定义数组
    val arr2 = Array(1,2,3)
    // 访问数组元素
    println(arr2(0)) // 输出第一个元素:1
    println(arr2(2)) // 输出第三个元素:3
    // println(arr2(20)) // 注释:会触发数组越界异常
  }
}
scala 复制代码
package array

/**
 * Array 和 List 的区别
 *
 * array:有序,数组:元素在空间上连续,通过下标去访问元素会特别快!
 * List:有序,链表:元素在空间上不连续
 *
 * 两种类型
 * 1.可变
 * 2.不可变:一个数组创建之后,不能添加,不能删除!
 *
 * 常用方法:添加,删除,查找,循环,排序,.....
 */


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

    // 追加元素(单个)
    arr1 += 4
    // 追加元素(多个)
    arr1 ++= Array(5,6,7)

    // 删除元素:删除下标为1的元素
  //  arr1.remove(0)
    // 删除元素:从下标0开始,删除3个元素
    arr1.remove(0, 3)

    // 修改元素:将下标为0的元素改为700
    arr1(2) = 700

    // 查找元素:判断是否包含指定值
    println(arr1.contains(6))  // 输出false(原元素已被删除)
    println(arr1.contains(8))// 输出true
    
    println(arr1.sum)//求和

    // 遍历数组
    arr1.foreach(ele => println(ele))
  }
}

四.数组常用方法

  1. 映射(Map)。arr.map(f):对数组中的每个元素应用函数f,并返回一个新的不可变数组。

  2. 过滤(Filter)。任务搜索

  3. 搜索和比较

  • arr.indexOf(elem):返回元素elem在数组中的第一个索引。

  • arr.contains(elem):检查数组是否包含元素elem。

  1. 切片(Slice)

arr.slice(from, until):返回数组的一个子数组,从索引from开始直到索引until(不包括until)。

scala 复制代码
package array


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

  // 排序:降序排序(a > b)
  val arr2 = arr1.sortWith((a, b) => a > b)

  // 切片:获取下标0(包含)到3(不包含)的元素
  val arr3 = arr1.slice(0, 3)

  // 过滤:保留大于0的元素
  val arr4 = arr1.filter(x => x > 0)

  // 搜索元素下标:查找-2的位置(不存在则返回-1)
  val target = -2
  val result = arr1.indexOf(target)
  println(s"${target}的下标是 ${result}")

  // 遍历过滤后的数组
  arr4.foreach(ele => println(ele))
}
}

五.多维数组

最典型的多维数组就是二维数组,类似于表格。有两种定义方式:

直接定义: Array.ofDim(x,y)

从一维数组转化得来: 数组. grouped()

练习题

scss 复制代码
package caseclass

import scala.collection.mutable.ListBuffer
import scala.collection.mutable.ArrayBuffer
import java.time.LocalDate

// 1. 使用case class定义DreamItem类
case class DreamItem(
                      content: String,    // 内容
                      isCompleted: Boolean, // 是否完成
                      deadline: LocalDate,  // 截止日期
                      priority: Int       // 优先级
                    )

object DreamItemDemo {
  def main(args: Array[String]): Unit = {
    // 2. 定义可变Array保存DreamItem
    val dreamArr = scala.collection.mutable.ArrayBuffer[DreamItem]()

    // 3. 添加3个梦想
    dreamArr += DreamItem("学scala", false, LocalDate.of(2025,12,31), 2)
    dreamArr += DreamItem("练字", false, LocalDate.of(2026,1,15), 3)
    dreamArr += DreamItem("减肥", false, LocalDate.of(2025,12,20), 1)

    // 4. 将第2个梦想设置为已完成
    dreamArr(1) = dreamArr(1).copy(isCompleted = true)

    // 5. 调高第3个梦想的优先级
    dreamArr(2) = dreamArr(2).copy(priority = dreamArr(2).priority + 2)

    // 6. 根据优先级从高到低排序
    val sortedDreams = dreamArr.sortWith((a,b) => a.priority > b.priority)

    // 7. 保存优先级排名前5的梦想
    val top5Dreams = sortedDreams.slice(0,5)

    // 8. 循环输出梦想列表
    top5Dreams.foreach(dream => {
      println(s"内容:${dream.content},完成:${dream.isCompleted},截止日:${dream.deadline},优先级:${dream.priority}")
    })
  }
相关推荐
满山狗尾草2 天前
map的常规操作
scala
渣渣盟3 天前
Flink实时数据写入Redis实战
大数据·scala·apache
pale_moonlight3 天前
十、Scala应用实践(下)
linux·开发语言·scala
云岫1154 天前
高贵的hasNext带着“迭代器”袭击你的大脑
scala
卓码软件测评6 天前
第三方软件测试评测机构:【基于Scala DSL的Gatling脚本开发:从零开始构建首个负载测试模型】
后端·测试工具·测试用例·scala·负载均衡·压力测试
洛克大航海6 天前
Ubuntu 中安装 Scala 及在 IntelliJ IDEA 中配置 Scala开发环境
scala·intellij-idea·ubuntu24.04
小坏讲微服务7 天前
SpringBoot4.0整合Scala完整使用
java·开发语言·spring boot·后端·scala·mybatis
bigdata-rookie7 天前
Scala 泛型
开发语言·后端·scala
卓码软件测评7 天前
【第三方CNAS软件测试机构:Gatling中的资源监控_实时收集服务器CPU、内存、磁盘I/O和网络指标】
后端·测试工具·测试用例·scala·压力测试