数组越界

76 阅读2分钟
object class4 {
  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

其他避免方法

1. 使用 “安全下标访问” 工具方法

可以自己封装一个工具函数,统一处理下标越界的情况(比如返回默认值):

scala

// 自定义安全访问方法:下标合法则返回元素,否则返回默认值
def safeGet[T](arr: Array[T], index: Int, defaultValue: T): T = {
  if (index >= 0 && index < arr.length) arr(index) else defaultValue
}

// 使用示例
val arr = Array(1,2,3)
println(safeGet(arr, 20, -1)) // 下标20越界,返回默认值-1

2. 用集合类替代数组(更安全的容器)

Scala 中很多集合(如ListVector)的下标访问也会抛越界异常,但可以结合headOptionlastOption等方法安全访问首尾元素;或者用Try包装访问操作(捕获异常):

scala

import scala.util.Try

val list = List(1,2,3)
// 用Try捕获越界异常,转为Success/ Failure
val accessResult = Try(list(20)).toOption
accessResult match {
  case Some(v) => println(v)
  case None => println(&#34;下标越界&#34;)
}

3. 避免手动控制下标(用函数式遍历)

尽量不用 “下标 + 循环” 的方式操作数组,而是用mapforeachfold等函数式方法,从根源上减少下标使用:

scala

val arr = Array(1,2,3)
// 无需下标,直接遍历元素
arr.foreach(ele => println(ele))
// 或用for推导式遍历元素
for (ele