【问题标题】:Create and populate two-dimensional array in Scala在 Scala 中创建和填充二维数组
【发布时间】:2011-01-30 13:47:17
【问题描述】:

在 Scala 中创建预填充二维数组的推荐方法是什么?我有以下代码:

val map = for {
    x <- (1 to size).toList
} yield for {
        y <- (1 to size).toList
    } yield (x, y)

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

【问题讨论】:

    标签: arrays scala scala-collections


    【解决方案1】:

    在 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 我不确定fromFunction——我以前从未注意到它——但是tabulate(在Scala 2.7 上出现在List)的工作方式非常类似于为了理解你写的,但是0 until size而不是1 to size。然而,在 Scala 2.7 上,它只是一维的,因此您需要嵌套它们。在 Scala 2.8 上,您可以提供多个维度(我认为最多 5 个)。
    • 谢谢。对于其他感兴趣的人,这在 2.7 上效果很好: List.tabulate(3, x => List.tabulate(3, y => (x, y)).toArray).toArray
    • 另一种直接的方法... val 2d_array:Array[Array[MyClass]] = Array.fill(height) { Array.fill(width) { new MyClass } }
    • @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 也是一个很好的建议......)

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多