Array[Int]
のようなものがあるとします
val array = Array( 1, 2, 3 )
次の例のように、配列に要素、たとえば値4
を追加したいと思います。
val array2 = array + 4 // will not compile
もちろん、System.arraycopy()
を使用して、自分でこれを行うこともできますが、これにはScalaライブラリ関数が必要であり、これを見つけることはできません。ポインタをありがとう!
ノート:
次の行のように、別の要素の配列を追加できることは承知していますが、それはあまりにも回り過ぎているようです:
val array2b = array ++ Array( 4 ) // this works
ListとArrayの長所と短所を認識しています。ここでは、特にArrayの拡張に関心があるさまざまな理由について説明します。
:+
演算子メソッドを指す回答をありがとう。これは私が探していたものです。残念ながら、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
のカスタム実装を使用してライブラリでこれを修正できなかったのではないかと思いますか?
それが価値があるため、私はチケットを提出しました: https://issues.scala-lang.org/browse/SI-5017
:+
を使用して要素を配列に追加し、+:
を使用して先頭に追加できます。
0 +: array :+ 4
生成する必要があります:
res3: Array[Int] = Array(0, 1, 2, 3, 4)
Seq
の他の実装と同じです。
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)