如果我们需要声明一个长度不变的数组,可以用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)