Scala - самый элегантный способ инициализации значений внутри массива, который уже был объявлен? - PullRequest
7 голосов
/ 03 сентября 2011

У меня есть 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; k++)
        {
            3dArray[i][j][k] = 1;
        }
    }
}

Какой самый элегантный подход к тому же?

Ответы [ 3 ]

18 голосов
/ 03 сентября 2011

Не уверен, что есть особенно элегантный способ сделать это, но вот один из способов (я использую суффикс s для обозначения измерения, т.е. xss - это двумерный массив).

val xsss = Array.ofDim[Int](512, 8, 8)
for (xss <- xsss; xs <- xss; i <- 0 until 8) 
  xs(i) = 1

Или, используя transform , он становится еще короче:

for (xss <- xsss; xs <- xss)
  xs transform (_ => 1)
5 голосов
/ 03 сентября 2011
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
2 голосов
/ 03 сентября 2011

См .: http://www.scala -lang.org / api / current / index.html # scala.Array $

У вас есть Array.fill для инициализации массива от 1 до 5измерение для некоторого заданного значения и Array.tabulate для инициализации массива от 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...