🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🧰 数组的创建与初始化

🔧 数组的常用操作

🔄 数组的遍历

📦 数组与集合的转换

⚡ 高级特性与应用

💡 性能优化建议

⚠️ 注意事项


img

Scala 数组是存储固定大小同类型元素序列的重要数据结构。让我为你梳理 Scala 数组的核心概念、操作和实用技巧。

下面是 Scala 中两种主要数组类型的对比,帮助你快速把握它们的核心区别:

特性维度

定长数组 (Array)

变长数组 (ArrayBuffer)

​可变性​

长度固定,内容可修改

长度和内容均可变

​创建方式​

Array(1,2,3)new Array[Int](3)

ArrayBuffer[Int]()ArrayBuffer(1,2,3)

​元素操作​

可修改现有元素

可追加 (+=, append)、插入 (insert)、移除 (remove) 元素

​性能特点​

内存占用少,访问速度快

动态扩容有一定开销

​适用场景​

数据量固定或已知,需高效存储和访问

数据量变化频繁,需要频繁增删元素

​相互转换​

使用 toBuffer转换为变长数组

使用 toArray转换为定长数组

🧰 数组的创建与初始化

​1. 定长数组​

// 方式一:使用 apply 方法(推荐)
val arr1 = Array(1, 2, 3)

// 方式二:指定类型和长度
val arr2 = new Array[Int](5) // 初始化为 0
val arr3 = Array.ofDim[Int](5) // 另一种方式

// 方式三:使用范围创建
val rangeArray = (1 to 5).toArray // Array(1, 2, 3, 4, 5)

​2. 变长数组 (ArrayBuffer)​

使用变长数组需导入 import scala.collection.mutable.ArrayBuffer

// 创建空的可变数组
val buffer = ArrayBuffer[Int]()

// 初始化带元素的变长数组
val mutableArray = ArrayBuffer(1, 2, 3)

// 追加元素
buffer += 1
buffer.append(2)
buffer ++= Array(3, 4, 5) // 追加多个元素

// 插入元素
buffer.insert(1, 6, 7) // 在索引1处插入6和7

// 移除元素
buffer.remove(0) // 移除索引0处的元素
buffer -= 2 // 移除元素2
buffer --= Array(3,4) // 移除多个元素

​3. 多维数组​

// 创建二维数组
val matrix = Array.ofDim[Int](2, 3) // 2行3列
matrix(0)(0) = 1 // 赋值

// 创建并初始化二维数组
val initializedMatrix = Array(Array(1, 2, 3), Array(4, 5, 6))

🔧 数组的常用操作

​1. 基础操作​

val nums = Array(3, 1, 4, 1, 5, 9, 2)

// 访问元素
println(nums(2)) // 输出: 4

// 修改元素
nums(0) = 10 // 数组变为 Array(10, 1, 4, 1, 5, 9, 2)

// 获取长度
println(nums.length) // 输出: 7
println(nums.size)   // 输出: 7

​2. 高级转换与操作​

Scala 数组支持丰富的高阶函数式操作:

val numbers = Array(1, 2, 3, 4, 5)

// map: 对每个元素应用函数
val doubled = numbers.map(_ * 2) // Array(2, 4, 6, 8, 10)

// filter: 过滤满足条件的元素
val evens = numbers.filter(_ % 2 == 0) // Array(2, 4)

// reduce: 聚合操作
val sum = numbers.reduce(_ + _) // 15

// foldLeft: 带初始值的累积操作
val product = numbers.foldLeft(1)(_ * _) // 120

// sorted: 排序
val sortedNums = numbers.sorted // Array(1, 2, 3, 4, 5)

// sortWith: 自定义排序
val desc = numbers.sortWith(_ > _) // Array(5, 4, 3, 2, 1)

​3. 搜索与检查​

val arr = Array(1, 2, 3, 2, 1)

// 查找元素索引
println(arr.indexOf(2)) // 输出: 1
println(arr.lastIndexOf(2)) // 输出: 3

// 检查元素存在
println(arr.contains(3)) // 输出: true

// 去重
val distinctArr = arr.distinct // Array(1, 2, 3)

​4. 其他实用操作​

// 切片操作
val slice = arr.slice(1, 3) // 获取索引1到3(不包括)的元素

// 取首尾元素
val first = arr.head // 第一个元素
val last = arr.last // 最后一个元素
val rest = arr.tail // 除第一个外的所有元素

// 数组拼接
val combined = arr ++ Array(4, 5) // Array(1, 2, 3, 2, 1, 4, 5)

// 转换为字符串
val str = arr.mkString(", ") // "1, 2, 3, 2, 1"
val bracketed = arr.mkString("[", "-", "]") // "[1-2-3-2-1]"

🔄 数组的遍历

有多种方式可以遍历数组:

val arr = Array(10, 20, 30)

// 1. for循环直接遍历元素
for (elem <- arr) {
  println(elem)
}

// 2. 通过索引遍历
for (i <- 0 until arr.length) {
  println(arr(i))
}

// 3. 使用range遍历
for (i <- Range(0, arr.length)) {
  println(arr(i))
}

// 4. 使用foreach高阶函数
arr.foreach(println)

// 5. 使用foreach with匿名函数
arr.foreach(elem => println(elem))
arr.foreach(println(_)) // 简写形式

📦 数组与集合的转换

val array = Array(1, 2, 2, 3)

// 数组转换为各种集合
val set = array.toSet // Set(1, 2, 3) - 自动去重
val list = array.toList // List(1, 2, 2, 3)
val vector = array.toVector // Vector(1, 2, 2, 3)
val buffer = array.toBuffer // 可变缓冲区

// 集合转换为数组
val newArray = set.toArray // 可能乱序: Array(1, 2, 3)

⚡ 高级特性与应用

​1. 并行数组操作​

对于大数据集,可利用并行处理提升性能:

val largeArray = (1 to 100000).toArray
val parArray = largeArray.par // 转换为并行数组

// 并行操作会自动利用多核
val parSum = parArray.sum // 并行求和
val parFiltered = parArray.filter(_ % 2 == 0).map(_ * 2) // 并行过滤和映射

​2. 使用 yield 进行转换​

val original = Array(1, 2, 3, 4, 5)

// 使用 for-yield 创建新数组
val squared = for (elem <- original) yield elem * elem
// 结果: Array(1, 4, 9, 16, 25)

// 带条件的转换
val evenTens = for (elem <- original if elem % 2 == 0) yield elem * 10
// 结果: Array(20, 40)

​3. 拉链操作 (Zip)​

将两个数组合并为一个元组数组:

val names = Array("Alice", "Bob", "Charlie")
val scores = Array(85, 92, 78)

val zipped = names.zip(scores) 
// 结果: Array(("Alice", 85), ("Bob", 92), ("Charlie", 78))

// 解压缩
val (unzippedNames, unzippedScores) = zipped.unzip

💡 性能优化建议

  1. ​选择合适的数组类型​​:数据量固定时使用定长数组 Array,需要频繁增删元素时使用变长数组 ArrayBuffer

  2. ​避免不必要的复制​​:Scala 数组操作大多返回新数组,需注意大数据集下的内存开销。

  3. ​利用并行处理​​:对计算密集型操作和大数据集使用 .par创建并行数组。

  4. ​使用尾递归​​:处理数组递归时使用尾递归避免栈溢出。

  5. ​预分配空间​​:对于 ArrayBuffer,如果知道大致大小,可预先分配空间减少扩容开销。

⚠️ 注意事项

  1. ​索引越界​​:访问不存在的索引会抛出 ArrayIndexOutOfBoundsException

  2. ​类型一致性​​:数组元素应保持相同类型,否则会被推断为公共父类型(如 Any)。

  3. ​并行操作副作用​​:并行操作中的副作用(如修改外部变量)可能导致线程安全问题。

  4. ​变长数组性能​​:ArrayBuffer的中间插入删除操作(insert, remove)时间复杂度为 O(n),需谨慎使用。

希望这些信息能帮助你高效地使用 Scala 数组。如果你有任何其他问题,请随时告诉我!

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐