0

我想初始化一个数组,以便它的每个元素都等于它的索引:

def method1(obj: AnyRef) = {
  //.... 
  if (obj.isInstanceOf[Array[Int]]) {
      val arr1 = obj.asInstanceOf[Array[Int]]
      val arr2: Array[Int] = new Array[Int](arr1.length)
      // initialize arr2. How?
      arr2 // arr2[0] = 0, arr2[1] = 1, etc....
    }
4

2 回答 2

5

您可以转换RangeArray.

var arr2 = (0 until arr1.length).toArray

indices收集返回的方法Range

var arr2 = arr1.indices.toArray

如果你有一个数组并想填充它,你可以使用copyToArray方法:

(0 until arr2.length).copyToArray(arr2)

此方法之间没有性能差异:toArray由方法实现copyToArray

Range仅包含 3 个Int字段:和start,因此几乎没有内存开销。endstep

range对象中还有方法Array

val arr2 = Array.range(0, arr1.length) // contains 0, excludes arr1.length

还有一些其他的方法来填充数组。在这种情况下,这些方法不是很有用。

方法fill

var i = -1
val arr2 = Array.fill(arr1.length)({i+=1; i})

方法apply

val arr2 = Array.apply(0, (1 until arr1.length): _*) // Array(0) on empty arr1

如果您没有Array收集并且想要更改其元素并让Array您可以使用collection.breakOut方法:

// this is not that case
val arr2: Array[Int] = (0 until arr1.length).map(identity)(breakOut)
于 2013-06-22T06:58:30.543 回答
4

对于基于索引的初始化,我们有tabulate方法。在你的情况下:

val arr2 = Array.tabulate(arr1.length)(index => index)

或者,更短

val arr2 = Array.tabulate(arr1.length)(identity)
于 2013-06-22T07:19:45.283 回答