32scala中的Array

29 阅读3分钟

(一)Array的定义

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

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

(二)不可变数组

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

我们主要学习它的一些常规操作:创建数组,访问元素,填充Array.range

1. 创建不可变数组

2. 访问元素: 注意不要越界

3. 获取数组的长度:arr.length:获取数组的长度

package array

/**
 * Array 和 List 的区别
 * Array: 有序, 数组;元素在空间上连续;通过下标访问元素会特别快
 * List: 有序, 链表;元素在空间上不连续
 *
 * 两种类型: 可变, 不可变
 * 不可变: 一个数组创建之后, 不能添加, 不能删除!
 *
 * 常用的方法: 添加, 删除, 查找, 循环, 排序, ......
 */
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)
    // arr2 += 4 报错 不可变对象
    println(arr2(0))
  }
}

image.png

(三)可变数组

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

(1) 添加一个元素;+= 元素

(2) 添加多个元素;+=(元素1, 元素2)

2. 删除元素

(1) 删除一个元素: -= 元素

(2) 删除多个元素: -= (元素1, 元素2)

(3) 删除指定位置的元素: remove(下标)

(4) 删除指定位置的多个元素:remove(下标起点,下标终点)

package array

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

    arr1 += (5,6,7)

    // 删除
    arr1 -= 4
    // 删除某个下标上的元素
    // arr1.remove(0)
    arr1.remove(0, 3) // 从指定位置开始删除,删除几个?

    // 修改
    arr1(2) = 700

    // 判断是否存在
    println(arr1.contains(6)) // true
    println(arr1.contains(8)) // false

    println(arr1.sum) // 求和
    arr1.foreach(ele=>println(ele))
  }
}

image.png

(四)数组常用方法

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

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

3. 搜索和比较

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

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

4. 切片(Slice)

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

package array

object array04 {
  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

(五)多维数组

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

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

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

var arr2 = arr1.grouped(5)
var arr3 = arr2.toArray.map(_.toArray)