我想初始化一个数组,以便它的每个元素都等于它的索引:
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....
}
答案 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
copyToArray
为implemented。
Range
仅包含3个Int
字段:start
,end
和step
,因此几乎没有内存开销。
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)