Scala专题系列(三):Scala数组

2022-04-18 13:54:35 浏览数 (1)

一 : 定长数组

如果我们需要声明一个长度不变的数组,可以用scala中的Array,比如:

val nums = new Array[Int](10) // 声明一个容量为10个整数的数组,所有元素的初始化为0 val strs = new Array[String](10) // 声明一个容量为10个字符串的数组,所有元素的初始化为null val arr = Array("hello","world") // 声明一个长度为Array[String] -- 类型是推断出来的 , 如果在声明中已经提供了初始值就不需要new

在JVM中,Scala的Array是以Java数组方式实现,上述中的数组在JVM中的类型为java.lang.String[] , Int,Double或其它与java中基本类型对应数组都是基本类型数组,Array(1,2,3,4,5) 在JVM中就是一个Int[]

二 :变长数组:数组缓冲

对于变长数组,Java中有ArrayList Scala中的等效数据结构为ArrayBuffer

import scala.collection.mutable.ArrayBuffer

val b = ArrayBuffer[Int]() // 或者new ArrayBuffer[Int] 一个空的数组缓冲,准备存放整数

b = 1

b = (2,3,4,,5) // 在尾端添加多个元素,以括号括起来

b = Array(13,14,15) // 也可以用 =操作符追加任何集合

b.trimEnd(5) // 移除最后5个元素

我们可以在数组的任意位置插入或者移除元素,但这样的操作并不那么高效(在数组缓冲的尾端添加或移除元素是一种高效的操作)

b.insert(2,4) // ArrayBuffer(1,2,2,3,4,5) 在下标2之前插入

b.insert(2,3,4,5,6) // 在下标2前插入任意多的元素

将数组缓冲转换为Array b.toArray

反之 将a.toBuffer 可以将一个数组转换为数组缓冲 b.toBuffer

三:遍历数组和数组缓冲

在scala 中处理数组的方式如下:

for( i <- 0 until a.length ) println( i ":" a(i) )

变量i的取值从0到a.length-1

util是RechInt类的方法,返回所有小于(但不包括)上限的数字,比如

0 util 10 返回的是 Range(0,1,2,3,4,5,6,7,8,9)

数组转换

在Scala中对数组进行转换时很简单的,这些转换不会修改原始数组,而是产生一个全新的数组

val a = Array(2,3,5,7,11)

val Result = for(elem <- a ) yield 2 * elem // result是Array(4,6,8)

for(...)yield 循环创建了一个类型与原始集合相同的新集合

也可以用另外一种写法来实现

a.filter(_ % 2 == 0).map{2 * _}

或者

a.filter { _ % 2 == 0 } map{ 2 * _ }

四 :数组常用算法

在Scala中有内置的函数来处理一些业务运算中的求和与排序

Array( 1,3,4,5 ).sum // 13 对ArrayBuffer同样适用

要使用sum方法,元素类型必须是数值类型,要么是整型,要么是浮点数或者BigInteger、BigDecimal

同样 Min和max 输出数组或数组缓冲中最大和最小元素

ArrayBuffer("a","aa","aaa").max // "aaa"

sorted 方法将数组或数组缓存排序并返回经过排序的数组或者数组缓冲,这个过程并不会修改原始版本

val b = ArrayBuffer(1,5,3,2)

val bSorted = b.sorted(_ < _) // b 并没有被修改,bsorted是ArrayBuffer(1,2,3,5)

如果想要显示数组或数组缓冲的内容,可以用mkString方法,它允许你指定元素之间的分隔符

a.mkString(" , ")

五:多维数组

和java一样,多维数组是通过数组的数组来实现的,举例来说,Double的二维数组类型为Arry[Array[Double]]

加入要构造这样的数组,可以用ofDim方法:

val matrix = Array.ofDim[Double](3,4) // 三行,四列

要访问其中的元素,可以使用两对圆括号

matrix(row)(column) = 42

也可以创建不规则的数组,每一行的长度各不相同

val truangle = new Array[Array[Int]](10)

for(i <- 0 util triangle.length)

triangle(i) = new Array[Int](i 1)

0 人点赞