web-dev-qa-db-ja.com

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. ListとArrayの長所と短所を認識しています。ここでは、特にArrayの拡張に関心があるさまざまな理由について説明します。

編集1

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

編集2

それが価値があるため、私はチケットを提出しました: https://issues.scala-lang.org/browse/SI-5017

103
Gregor Scheidt

:+を使用して要素を配列に追加し、+:を使用して先頭に追加できます。

0 +: array :+ 4

生成する必要があります:

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

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

178
tenshi
val array2 = array :+ 4
//Array(1, 2, 3, 4)

作品も「逆転」:

val array2 = 4 +: array
Array(4, 1, 2, 3)

「インプレース」バージョンもあります。

var array = Array( 1, 2, 3 )
array +:= 4
//Array(4, 1, 2, 3)
array :+= 0
//Array(4, 1, 2, 3, 0)
51
Landei

最も簡単な方法は次のとおりです。

Array(1, 2, 3) :+ 4

実際、Arrayは暗黙的に WrappedArray に変換できます

7
Nicolas