在循环中初始化整数数组

时间:2019-03-03 22:30:39

标签: arrays scala

我想在Scala中初始化一个连续整数数组(例如从1到100)。

val N = 100
val arr = new Array[Int](N)

在命令式和功能式范例中,执行此操作的最佳方法是什么?

3 个答案:

答案 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