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

に変換でき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ます。

Rangeには、 、の3 つIntのフィールドしか含まれていないため、メモリのオーバーヘッドはほとんどありません。startendstep

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 に答える