2014-12-04 70 views
0

我對R語言有一些經驗,現在我想嘗試Scala語言。在R語言中,我可以將一個值賦給一個向量的許多元素,例如在Scala中爲數組中的多個元素賦值1

(xs <- 1:10) 
#[1] 1 2 3 4 5 6 7 8 9 10 
k <- 3 
xs[1:k] <- xs[k+1] 
xs 
# 4 4 4 4 5 6 7 8 9 10 

它將k + 1元素的值分配給指數從1到k的所有元素。是否有可能在Scala中沒有循環(我的意思是數組在Scale中)?我知道有切片方法,但它只返回一個數組的值,不能使用此方法修改數組的元素。

更甚者,如果我只想更改元素的值並且不想從集合中添加/刪除元素,我應該使用Array還是ArrayBuffer?

回答

4

查看java.util.Arrays.fill方法。

scala> val xs = (1 to 9).toArray 
xs: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) 

scala> val k = 6 
k: Int = 6 

scala> java.util.Arrays.fill(xs, 0, k, xs(k)) 

scala> xs 
res10: Array[Int] = Array(7, 7, 7, 7, 7, 7, 7, 8, 9) 
2

對於第二個問題,如果不調整集合大小但編輯元素,請使用數組。 ArrayBuffer非常類似於Java ArrayList,它在需要時自調整大小,因此插入是攤銷常量,而不僅僅是常量。

對於你的第一個問題,我不知道集合庫中的任何方法可以讓你做到這一點。這很明顯是用於循環的語法糖,所以如果你真的在乎(你真的真的發現自己需要經常這樣做嗎?),你可以定義一個隱式類,並且自己定義一個循環方法,然後使用它。如果你想看到這樣的代碼的例子,寫一個評論,否則嘗試自己做,這將是一個很好的訓練。

+0

在R中需要避免顯式循環,因爲它們比內置函數(在C++中爲循環)慢得多。我能否假設在Scala中不需要避免循環,並且它們與嵌入方法/函數一樣快? – bartoszukm 2014-12-04 22:50:15

+0

是的。 Scala中的循環完全正確,性能明智。 – sjrd 2014-12-04 23:43:06

+0

@bartoszukm如果你真的關心循環的性能,我想使用'cfor'宏向你推薦https://github.com/non/spire。我們廣泛使用它,並看到了良好的速度增加。從本質上講,它將你的循環編譯成尾循環函數,編譯成while循環,產生很好的語法,但速度仍然很快。 – 2014-12-05 13:38:42

1

斯卡拉有Range類。如果您願意,您可以將Range轉換爲Array

scala> val n = 10 
n: Int = 10 

scala> Range(1,n) 
res22: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) 

scala> res22.toArray 
res23: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) 
        │ 

ArrrayBufferconstant time update和將是很好的更新值。

+3

如果只更新值,爲什麼不使用'Array'? – 2014-12-04 22:26:00

+0

'數組'也不錯。 – Brian 2014-12-04 22:28:03