2013-06-22 44 views
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.... 
    } 

回答

6

你可以轉換RangeArray

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,所以幾乎沒有內存開銷。

還有方法rangeArray對象:

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) 
+0

它應該是 「直到」,而不是 「爲」,不應該嗎? –

+0

@Grienders,謝謝你,你是對的。 – senia

4

對於基於索引的初始化,我們有tabulate方法。你的情況:

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

,或者更短的

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