我对R语言有一些经验,现在我想尝试使用Scala语言。在R语言中,我可以为向量的许多元素分配一个值,例如
(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中没有循环(我的意思是规模中的数组)这样做?我知道有slice方法,但它只返回一个Array的值,不能使用这个方法修改Array的元素。
更重要的是,如果我只想更改元素的值并且我不想添加/删除集合中的元素,我应该使用Array还是ArrayBuffer?
答案 0 :(得分:5)
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)
答案 1 :(得分:2)
对于第二个问题,如果不调整集合大小但编辑元素,请坚持使用数组。 ArrayBuffer
非常类似于Java ArrayList
,它在需要时自行调整大小,因此插入是分摊常量,而不仅仅是常量。
对于您的第一个问题,我不知道集合库中允许您执行此操作的任何方法。它显然是循环的语法糖,所以如果你真的关心(你真的发现自己经常需要这样做吗?),你可以定义一个隐式类并自己定义一个循环的方法,然后使用它。如果您想查看此类代码的示例,请撰写评论,否则请自行尝试,这将是一次良好的培训。
答案 2 :(得分:1)
Scala有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)
│
ArrrayBuffer
有constant time update,有助于更新值。