2016-04-18 59 views
4

我遇到了一個問題,我需要在Array的中間添加一個新值(即複製原始數組並將其替換爲新數組)。我成功地解決了我的問題,但我想知道是否有其他方法來做到這一點,而不需要將數組緩存一段時間。在scala中爲數組添加值

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

好了,如果確實是額外的變量是什麼困擾着你,你能做到一氣呵成:

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) 

但需要注意的是多麼容易做出差一錯誤在這裏(我覺得有ISN」噸,但我沒有測試過)。所以做這件事的唯一理由是,如果你真的需要高性能,那只有當它發生在循環中時纔有可能,在這種情況下可以回到第二句話。