在Scala中创建和填充二维数组

6
在Scala中,创建一个预填充的二维数组推荐使用哪种方法? 下面是代码示例:
val map = for {
    x <- (1 to size).toList
} yield for {
        y <- (1 to size).toList
    } yield (x, y)

如何创建一个数组而不是列表?用 .toArray 替换 .toList 无法编译。是否有比嵌套的 for 表达式更简洁或易读的方法?

2个回答

8
在Scala 2.7中,使用Array.range
for {
  x <- Array.range(1, 3)
} yield for {
  y <- Array.range(1, 3)
} yield (x, y)

在Scala 2.8中,使用Array.tabulate
Array.tabulate(3,3)((x, y) => (x, y))

Array.tabulate看起来很不错,与Rex Kerr在另一个答案中建议的Array.fromFunction类似。除了我看到Array.fromFunction在2.8中已被弃用之外,它们有什么区别?它们实际上是如何工作的? - asteinlein
@asteinlein 我不确定 fromFunction -- 我以前从未注意过 -- 但是 tabulate(在 Scala 2.7 上的 List 中存在)几乎与您编写的 for-comprehension 相同,但是使用 0 until size 而不是 1 to size。然而,在 Scala 2.7 上,它仅限于一维,因此您需要嵌套它们。在 Scala 2.8 上,您可以提供多个维度(最多 5 个)。 - Daniel C. Sobral
谢谢。对于其他有兴趣的人,这在2.7上运行得很好: List.tabulate(3, x => List.tabulate(3, y => (x, y)).toArray).toArray - asteinlein
另一种简单的方法是...val 2d_array:Array[Array[MyClass]] = Array.fill(height) { Array.fill(width) { new MyClass } } - jk.
@jk。如果你认为这是一样的东西,那么你没有理解它正在做什么。 - Daniel C. Sobral
啊,我错过了将坐标传递到生成数组的函数中的要求,可能吗? - jk.

2

除了其他方法外,您可以使用Array.rangemap

scala> Array.range(0,3).map(i => Array.range(0,3).map(j => (i,j)))
res0: Array[Array[(Int, Int)]] = Array(Array((0,0), (0,1), (0,2)), Array((1,0), (1,1), (1,2)), Array((2,0), (2,1), (2,2)))

或者你可以使用Array.fromFunction

scala> Array.fromFunction((i,j) => (i,j))(3,3)                    
res1: Array[Array[(Int, Int)]] = Array(Array((0,0), (0,1), (0,2)), Array((1,0), (1,1), (1,2)), Array((2,0), (2,1), (2,2)))

Scala 2.8为您提供了更多的选择——查看Array对象。(实际上,这也是对于2.7的好建议....)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接