Scala—在数组中初始化值的最优雅的方式';已经申报了吗?
我有一个3d数组,定义如下:Scala—在数组中初始化值的最优雅的方式';已经申报了吗?,scala,Scala,我有一个3d数组,定义如下: val 3dArray = new Array[Array[Array[Int]]](512, 8, 8) 在Javascript中,我将执行以下操作将每个元素分配给1: for (i = 0; i < 512; i++) { 3dArray[i] = []; for (j = 0; j < 8; j++) { 3dArray[i][j] = []; for (k = 0; k < 8;
val 3dArray = new Array[Array[Array[Int]]](512, 8, 8)
在Javascript中,我将执行以下操作将每个元素分配给1:
for (i = 0; i < 512; i++)
{
3dArray[i] = [];
for (j = 0; j < 8; j++)
{
3dArray[i][j] = [];
for (k = 0; k < 8; k++)
{
3dArray[i][j][k] = 1;
}
}
}
(i=0;i<512;i++)的
{
3dArray[i]=[];
对于(j=0;j<8;j++)
{
3dArray[i][j]=[];
对于(k=0;k<8;k++)
{
3dArray[i][j][k]=1;
}
}
}
做同样的事情最优雅的方法是什么?不确定是否有特别优雅的方法,但这里有一种方法(我使用后缀
s
表示维度,即xss
是一个二维数组)
val xsss=Array.ofDim[Int](512,8,8)
用于(xssfor){
我见:
使用Array.fill将1到5维的数组初始化为某个给定值,使用Array.tablate在给定当前索引的情况下初始化1到5维的数组:
scala> Array.fill(2,1,1)(42)
res1: Array[Array[Array[Int]]] = Array(Array(Array(42)), Array(Array(42)))
enter code here
scala> Array.tabulate(3,2,1){ (x,y,z) => x+y+z }
res2: Array[Array[Array[Int]]] = Array(Array(Array(0), Array(1)), Array(Array(1), Array(2)), Array(Array(2), Array(3)))
不管它值多少钱,3dArray
都不是一个有效的标识符。是的,但它说明了我希望的要点。第二种方法是我认为我可以做的,但只是不知道如何做。谢谢!使用Scala 2.13.3,我得到:警告:trait SeqOps中的方法转换不推荐(自2.13.0起)。对“IndexedSeq”改用“mapInPlace”
。用mapInPlace
替换transform
,以避免警告。您声明了新数组,但最初的问题是“…初始化数组中已声明的值?”
for (xss <- xsss; xs <- xss)
xs transform (_ => 1)
for {
i <- a.indices
j <- a(i).indices
k <- a(i)(j).indices
} a(i)(j)(k) = 1
for {
e <- a
ee <- e
i <- ee.indices
} ee(i) = 1
scala> Array.fill(2,1,1)(42)
res1: Array[Array[Array[Int]]] = Array(Array(Array(42)), Array(Array(42)))
enter code here
scala> Array.tabulate(3,2,1){ (x,y,z) => x+y+z }
res2: Array[Array[Array[Int]]] = Array(Array(Array(0), Array(1)), Array(Array(1), Array(2)), Array(Array(2), Array(3)))