我想在Scala中初始化一个连续整数数组(例如从1到100)。
val N = 100
val arr = new Array[Int](N)
在命令式和功能式范例中,执行此操作的最佳方法是什么?
答案 0 :(得分:4)
有一个专门的Array
构建器(Array.range
),用于构建Array
作为范围:
def范围(开始:整数,结束:整数):Array [Int]
Array.range(0, 10)
// Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
答案 1 :(得分:2)
初始化数组的最通用的功能方法可能是tabulate
:
Array.tabulate(100)(_ + 1)
这里,第一个参数是数组的大小,第二个参数是将索引映射到值的函数。
如果您想使用单个线程尽可能快地完成它,那么下面的命令性代码可能很难被击败,因为它在任何地方都没有使用任何更高阶的函数:
val N = 100
val a = new Array[Int](N)
var i = 0
while (i < N) {
a(i) = i + 1
i += 1
}
它还有一个优点,就是您可以控制数组,因此,如果您已经有分配的数组,则不必分配任何新的内存。
如果初始化不是那么简单(不只是增加一个整数),那么以下并行化版本可能会在非常大的N
上更快地工作:
val arr = new Array[Int](N)
for (i <- (0 until N).par) {
arr(i) = i + 1
}
在评论中已经提到,在这种简单情况下
(1 to 100).toArray
就足够了。
答案 2 :(得分:1)
如果您来自 命令式 编程领域,那么您会发现此技术很熟悉:
for (i <- 0 to N-1) {
arr(i) = i + 1
}
请注意,Scala中的数组是使用弯曲的括号而不是正方形的(如Java,C等)访问的。
用于初始化数组的另一种 功能 方法是:
val arr = (1 to N).toArray