定长数组
1
2
3
4
5
6
7
8
|
// 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。
1
2
3
4
5
6
7
8
|
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表达式还是可用的。这里再提一点更多的。
1
2
3
4
5
6
|
// 每两个元素一跳
for
(
i
<
-
0
until
(
a
.
length
,
2
)
)
// 反序遍历
for
(
i
<
-
0
until
a
.
length
reverse
)
// 不使用下标时
for
(
elem
<
-
a
)
|
数组转换
通过for推导式,可以便捷生成一个新的数组。
1
|
for
(
elem
<
-
a
if
elem
%
2
==
0
)
yield
2
*
elem
|
还有一种方式,对于习惯函数式编程的人来说更加熟悉:
1
|
a
.
filter
(
_
*
2
==
0
)
.
map
(
2
*
_
)
|
这里的操作都没有改变原数组,而是生成了一个新的数组。因为Scala结合了函数式编程范式,而函数式是比较排斥函数和方法的副作用的。
常用算法
1
2
3
|
val
b
=
ArrayBuffer
(
1
,
7
,
2
,
9
)
// 排序,不改变原来的数组,而是生成了一个新的数组
val
bSorted
=
b
.
sorted
(
_
<
_
)
|
多维数组
多维数组就是数组的数组,Scala中二维数组看起来就是 Array[Array[Double]]。
要构建多维数组,使用 ofDim方法。
1
2
3
4
5
6
7
8
|
// 三行四列的数组
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等。
1
2
3
4
|
import
scala
.
collection
.
JavaConversions
.
bufferAsJavaList
import
scala
.
collection
.
mutable
.
ArrayBuffer
val
command
=
ArrayBuffer
(
"ls"
,
"-al"
,
"/home/zheng"
)
val
pb
=
new
ProcessBuilder
(
command
)
// 这里自动包装了
|
从Java数组类到Scala数组也是差不多的。
http://nerd-is.in/2013-08/scala-learning-working-with-array/