初始化一个数组,使其中的每个元素都等于它的索引

时间:2013-06-22 06:56:03

标签: scala

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

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....
    }

2 个答案:

答案 0 :(得分:5)

您可以将Range转换为Array

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

集合上的方法indices返回Range

var arr2 = arr1.indices.toArray

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

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

此方法之间没有任何性能差异:方法toArray copyToArrayimplemented

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

Array对象中还有方法range

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)

答案 1 :(得分:4)

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

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

或更短

val arr2 = Array.tabulate(arr1.length)(identity)