Scala: 配列に要素を追加する最適な方法は何ですか? 質問する

Scala: 配列に要素を追加する最適な方法は何ですか? 質問する

Array[Int]いいね!があるとしましょう

val array = Array( 1, 2, 3 )

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

val array2 = array + 4     // will not compile

もちろん、System.arraycopy()これを自分で使用して実行することもできますが、これには Scala ライブラリ関数があるはずですが、見つけることができませんでした。ご指摘いただければ幸いです。

ノート:

  1. 次の行のように、別の配列の要素を追加できることはわかっていますが、それはあまりにも回りくどいようです。

    val array2b = array ++ Array( 4 )     // this works
    
  2. 私はリストと配列の利点と欠点を認識しており、さまざまな理由から配列の拡張に特に興味を持っています。

編集1

演算子メソッドを指し示す回答をありがとうございます:+。これこそ私が探していたものです。残念ながら、 を使用したカスタム append() メソッドの実装よりもかなり遅くarraycopy、約 2 ~ 3 倍遅くなります。 の実装を見るとSeqLike[]、ビルダーが作成され、配列が追加され、次にビルダーを介して追加が行われ、最後にビルダーがレンダリングされます。配列の実装としては適切ではありません。10 サイクルのうちの最速時間を調べるために、2 つの方法を比較する簡単なベンチマークを実行しました。あるクラスの 8 要素配列インスタンスへの単一項目の追加を 1000 万回繰り返すと、 ではFoo3.1 秒、 を使用する:+単純なappend()方法では 1.7 秒かかります。LongSystem.arraycopy();の 8 要素配列で単一項目の追加の繰り返しを 1000 万回実行すると、 では 2.1 秒:+、単純な方法では 0.78 秒かかりますappend()。 のカスタム実装を使用してライブラリでこれを修正できないでしょうかArray

編集2

参考までに、私はチケットを提出しました:SI-5017 は、英語で「issues.scala-lang.org/browse/SI-5017」と呼ばれます。

ベストアンサー1

:+配列に要素を追加したり、配列の先頭に追加したりするには、を使用します+:

0 +: array :+ 4

生成されるのは:

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

これは、 の他の実装の場合と同じですSeq

おすすめ記事