我想在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)]
答案 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)
}
}