在Scala中为数组的许多元素分配一个值

时间:2014-12-04 22:17:37

标签: scala

我对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?

3 个答案:

答案 0 :(得分:5)

查看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)

答案 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)
                    │

ArrrayBufferconstant time update,有助于更新值。