定长数组
// 10个整数的数组,所有元素初始化为0
val nums = new Array [ Int ] ( 10 )
// 长度为2的数组,类型是推断出来的
// 提供初始值时不需要使用new
val s = Array ( "Hello" , "World" )
// 访问元素
// 虽然s是val的,但是其中的内容还是可以变的
s ( 0 ) = "GoodBye"
在JVM中,Scala的数组是用Java的数组一样的方式实现的。
变长数组
对应于Java的ArrayList,Scala中可变长度的数组使用的是ArrayBuffer。
import scala . collection . mutable . ArrayBuffer
val b = ArrayBuffer [ Int ] ( )
// 也可以是 val b = new ArrayBuffer[Int]
// 在尾端添加元素
b += 1
b += ( 1 , 2 , 3 , 5 )
// 追加一个集合
b ++ = Array ( 8 , 13 , 21 )
其他的还是看API吧。
在ArrayBuffer尾端添加或者移除元素是高效的,但其他位置不是,所以尽可能将操作放在尾端进行。
还有Array和ArrayBuffer间的转换: b.toArray和 a.toBuffer。
遍历
前面见过的for表达式还是可用的。这里再提一点更多的。
// 每两个元素一跳
for ( i < - 0 until ( a . length , 2 ) )
// 反序遍历
for ( i < - 0 until a . length reverse )
// 不使用下标时
for ( elem < - a )
数组转换
通过for推导式,可以便捷生成一个新的数组。
for ( elem < - a if elem % 2 == 0 ) yield 2 * elem
还有一种方式,对于习惯函数式编程的人来说更加熟悉:
a . filter ( _ * 2 == 0 ) . map ( 2 * _ )
这里的操作都没有改变原数组,而是生成了一个新的数组。因为Scala结合了函数式编程范式,而函数式是比较排斥函数和方法的副作用的。
常用算法
val b = ArrayBuffer ( 1 , 7 , 2 , 9 )
// 排序,不改变原来的数组,而是生成了一个新的数组
val bSorted = b . sorted ( _ < _ )
多维数组
多维数组就是数组的数组,Scala中二维数组看起来就是 Array[Array[Double]]。
要构建多维数组,使用 ofDim方法。
// 三行四列的数组
val matrix = Array . ofDim [ Double ] ( 3 , 4 )
// 访问多维数组
maxtrix ( row ) ( column ) = 42
// 可以创建每行长度不一样的数组
val triangle = new Array [ Array [ Int ] ] ( 10 )
for ( i < - 0 until triangle . length )
triangle ( i ) = new Array [ Int ] ( i + 1 )
与Java的互操作
引入scala.collection.JavaConversions包内的隐式转换方法,就可以在代码中自动包装Scala内的数组和Java里的List等。
import scala . collection . JavaConversions . bufferAsJavaList
import scala . collection . mutable . ArrayBuffer
val command = ArrayBuffer ( "ls" , "-al" , "/home/zheng" )
val pb = new ProcessBuilder ( command ) // 这里自动包装了
从Java数组类到Scala数组也是差不多的。