【问题标题】:Multidimentional array of arrays in ScalaScala中的多维数组
【发布时间】:2014-08-31 00:18:15
【问题描述】:

我已经阅读了有关使用 ofdim 在 scala 中制作多维数组的信息,但是如果我不希望所有数组的大小相同怎么办? 我希望能够制作各种大小的数组,如下所示,但找不到任何东西。

dist = [[1,2,3],
        [10, 11, 13, 15, 16, 17, 19],
        [25]]

【问题讨论】:

  • 一个由不同长度或维度的数组组成的数组?
  • 一系列不同长度的数组,用于将物品放入 bin 中;就像制作直方图一样。

标签: arrays scala


【解决方案1】:

您始终可以使用tabulate,然后根据索引构建您需要的大小,或者从大小列表映射到数组本身:

Array.tabulate(4)(i => Array.range(0,i))
// Array[Array[Int]] = Array(Array(), Array(0), Array(0, 1), Array(0, 1, 2))

Array(3,7,1).map(i => Array.range(0,i))
// Array[Array[Int]] = Array(Array(0, 1, 2), Array(0, 1, 2, 3, 4, 5, 6), Array(0))

JVM 没有真正的多维数组,只有数组的数组——所以 Scala 也没有。随意构建它们。

【讨论】:

  • 为什么当我做 var hist = Array.tabulate(9)(i => Array(0)) 并尝试打印 hist 我得到类似 [[I@5b895cb9
  • @vyruz - Array 没有打印其内容的 toString 方法。 REPL 将调用它自己的打印例程,而不是仅仅调用toString;您可以println(hist.map(_.mkString(", ")).mkString("\n")) 或类似的方式查看元素。
【解决方案2】:

最好选择像这样的 Array[List[Int]] 的列表数组。内部列表的长度可以满足您的需要。或列表列表,如果您不确定外部数组的长度。

【讨论】:

    【解决方案3】:

    如果在 binning 中考虑集合中的值以构建直方图,请考虑重复使用 partition(请参阅我在 https://stackoverflow.com/a/24540089/3189923 中的完整、相关答案),像这样,

    def histo(bounds: Array[Int], data: Array[Int]): Array[Array[Int]] = {
      bounds match {
        case Array(h)       => Array(data)
        case Array(h, t @ _*) => val (l,r) = data.partition( _ < h) 
                               l +: histo(t.toArray,r)
      }
    }
    

    因此对于

    val bounds = Array(10, 20, 30)
    val dist = Array(1, 2, 3, 10, 11, 13, 15, 16, 17, 19, 25)
    

    我们有这个

    histo(bounds, dist)
    res: Array[Array[Int]] = Array(Array(1, 2, 3), 
                                   Array(10, 11, 13, 15, 16, 17, 19), 
                                   Array(25))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多