有没有一种方法可以使用Scala的Range类填充多维数组

时间:2018-12-21 07:04:36

标签: scala multidimensional-array range

我想在Scala中创建一个二维数组。该阵列将二维空间划分为N个块。该数组的每个元素都有一个minX,maxX,minY和maxY值以及一个索引(从0到N ^ 2-1)。

例如,如果N = 8,我想创建从0到63的索引,并且每个索引对应于一个空间范围。如果我拥有整个空间的minX,maxX,minY,maxY,是否可以使用Scala的Range类在x和y维度上提供阶跃值,并使用索引和单个范围创建此数组?

这是我正在创建的类和函数:

class Grid (index: Int, minX: Double, minY: Double, maxX: Double, maxY: Double){
  def buildgrid(spaceminX: Double, spaceminY: Double, spacemaxX: Double, spacemaxY: Double,num_partitions:Int): Unit =
  {
    val stepX=spacemaxX-spaceminX/num_partitions
    val stepY=spacemaxY-spaceminY/num_partitions
    ???

  }}

在这里,以空格为前缀的变量是需要划分为N个块的整个空间的值。我被困在如何在函数中创建数组。 该数组的预期输出为: Array [(0,minX,maxX,minY,maxY),(1,minX,maxX,minY,maxY)...,(63,minX,maxX,minY,maxY)]

2 个答案:

答案 0 :(得分:1)

所有集合(包括Array)都有一个维度,并从0开始编制索引。对于2D Array,您要么需要自己计算索引,要么使用嵌套数组Array[Array],并且需要使用任一选项处理min_偏移量。

该库支持创建嵌套的Array。您可以使用Array.fill用固定值填充2D数组:

val array = Array.fill(n1, n2)(value)

或者您可以使用tabulate为每个坐标填充计算值:

val array = Array.tabulate(n1, 22){ case (a, b) => func(a, b) }

注意:Array.fill将为value的每个元素计算Array,因此请确保您传递的是值而不是表达式。

答案 1 :(得分:0)

您可以使用来理解:

object Example {

  def main(args: Array[String]): Unit = {
    /*
     X 0  1  2  3
    Y+--+--+--+--+
    0| 0| 1| 2| 3|
    1| 4| 5| 6| 7|
    2| 8| 9|10|11|
    3|12|13|14|15|
     +--+--+--+--+
    */

    val minX = 0
    val maxX = 3
    val minY = 0
    val maxY = 3

    val list = (for {
      y <- 0 to maxY-minY
      x <- 0 to maxX-minX
    } yield (y * (maxX-minX+1) + x, minX, maxX, minY, maxY)).toList

    println(list)
  }

}