2016-04-18 16 views
4

Arrayの真ん中に新しい値を追加する必要があった(つまり、元の配列のコピーを作成して新しい配列に置き換える)という問題に直面しました。私は正常に私の問題を解決しましたが、私はバッファをアレイをしばらく変更することなくこれを行うための他の方法があるかどうか疑問に思っていました。スカラの配列への値の追加

val original = Array(0, 1, 3, 4) 
val parts = original.splitAt(2) 
val modified = parts._1 ++ (2 +: parts._2) 

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

私の解答では好きではないのはpartsです。私はそのような中間段階を使用したくないです。これは、値を追加する最も簡単な方法ですか、または要素を追加するいくつかの良い方法がありますか?

+0

を[これ](http://stackoverflow.com/questions/4675222/scala-insert-into-list-at-specific-locationsが)いいです'List'を使うためのソリューションです。 –

答えて

8

これは何をするかpatch正確である:

val original = Array(0, 1, 3, 4) 
original.patch(2, Array(2), 0)  // Array[Int] = Array(0, 1, 2, 3, 4) 
+0

ありがとう! ! – Duzzz

1

これを行うにはmutable version of a collectionを使用できます。メソッドinsertは、あなたが望むものを行います(指定されたインデックスに要素を挿入します)。確かに余分な変数があなたを悩ま何であれば

1

さて、あなたは一度にそれを行うことができます。

val modified = original.take(2) ++ (2 +: original.drop(2)) 

しかし、あなたのユースケースに応じて、より良いフィットかもしれない示唆しAugustoのような変更可能なコレクションを使用して(たとえば、パフォーマンス、配列サイズ、複数のそのような編集...)。

1

質問は何ですか?これをループで実行している場合は、毎回新しい配列を割り当てるとパフォーマンスが低下するため、アプローチを再考する必要があります(挿入する前にすべての要素を挿入するなど)。

あなたがいない場合は、よく、あなたは、任意の中間変換を避けるためにSystem.arraycopyを使用することができます。

val original = Array(0, 1, 3, 4) 
val index = 2 
val valueToInsert = 2 

val modified = Array.ofDim[Int](original.length + 1) 
System.arraycopy(original, 0, modified, 0, index) 
modified(index) = valueToInsert 
System.arraycopy(original, index, modified, index + 1, original.length - index) 

をしかし、それはここではoff-by-oneエラーを作ることですどのように簡単に注意してください(私は「そこにISNと思います私はそれをテストしていない)。だからこそ唯一の理由は、本当に高性能が必要な場合です。ループ内で起こった場合にのみ起こります。その場合、2番目の文に戻ります。

関連する問題