1. ホーム
  2. arrays

[解決済み] Scala:Arrayに要素を追加する最良の方法は何ですか?

2022-02-11 10:47:03

質問

を持っているとします。 Array[Int] のように

val array = Array( 1, 2, 3 )

ここで、ある要素を配列に追加したいと思います。 4 次の例のように。

val array2 = array + 4     // will not compile

もちろん System.arraycopy() しかし、Scala ライブラリにはこのための関数があるはずで、私はそれを見つけられませんでした。何かご指摘をありがとうございます。

注意事項

  1. 次の行のように、別の要素のArrayを追加できることは承知していますが、それはあまりにも回りくどいように思います。

    val array2b = array ++ Array( 4 )     // this works
    
    
  2. 私はリストと配列の長所と短所を知っていますが、様々な理由から配列の拡張に特に関心を持っています。

編集1

を指摘する回答ありがとうございました。 :+ 演算子メソッドです。これは私が探していたものです。残念なことに、このメソッドは arraycopy -- 約2~3倍遅い。での実装を見ると SeqLike[] ビルダーが作成され、そこに配列が追加され、ビルダーを経由して追加が行われ、ビルダーがレンダリングされます。配列の実装としては、あまり良いとは言えない。2つの方法を比較する簡単なベンチマークを行いました。10サイクルのうち最速の時間を調べました。あるクラスの8要素の配列インスタンスに1項目の追加を1000万回繰り返すと Foo では3.1秒かかります。 :+ で1.7秒、シンプルな append() を使用するメソッドです。 System.arraycopy(); の場合、Long の 8 要素配列に対して 1,000 万回の単項目追加を繰り返すと 2.1 秒かかります。 :+ で0.78秒、単純な append() というメソッドがあります。のカスタム実装で修正できないものだろうか? Array ?

編集2

何はともあれ、チケットを提出しました。 https://issues.scala-lang.org/browse/SI-5017

解決方法は?

を使用することができます。 :+ は配列に要素を追加し +: で前置する。

0 +: array :+ 4

を生成する必要があります。

res3: Array[Int] = Array(0, 1, 2, 3, 4)

の他の実装と同じです。 Seq .