Есть ли способ построить динамические многомерные массивы в Scala? Я знаю, что массивы в Scala должны быть инициализированы по размерам и размерам, поэтому я не хочу этого. Структура данных должна быть динамичной. Я пытался создать его из списков в списках, но я каким-то образом потерял себя.
Существует так много разных типов, может быть, я просто не нашел подходящий. Поэтому, пожалуйста, подтолкните меня в правильном направлении.
Если вы хотите сделать что-то вроде
a (5) = // результат некоторого вычисления
, тогда вам нужно будет использовать что-нибудь из изменяемой иерархии коллекций. Я бы предложил ArrayBuffer
.
scala> import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.ArrayBuffer
scala> val a = ArrayBuffer.fill(3,3)(0)
a: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] = ArrayBuffer(ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 0, 0))
scala> a(2)(1) = 4
scala> a(0) = ArrayBuffer(1,2,3)
scala> a
res2: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]] = ArrayBuffer(ArrayBuffer(1, 2, 3), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 4, 0))
Обратите внимание, что fill
позволяет автоматически создавать и инициализировать до 5D структур. Также обратите внимание, что вы можете увеличить их длину, но это не расширит всю многомерную структуру, а только ту, которую вы добавляете. Так, например,
scala> a(2) += 7 // Add one element to the end of the array
res3: scala.collection.mutable.ArrayBuffer[Int] = ArrayBuffer(0, 4, 0, 7)
scala> a
res4: scala.collection.mutable.ArrayBuffer[scala.collection.mutable.ArrayBuffer[Int]]
= ArrayBuffer(ArrayBuffer(1, 2, 3), ArrayBuffer(0, 0, 0), ArrayBuffer(0, 4, 0, 7))
Ну, это во многом зависит от того, что вы собираетесь с ним делать, но лучше всего предположить IndexedSeq [IndexedSeq [T]]
(или более глубокие вложения), используя Вектор
как реализация для IndexedSeq
(в любом случае это реализация по умолчанию).
Например:
scala> IndexedSeq (IndexedSeq (1, 2, 3), IndexedSeq (4, 5), IndexedSeq (6, 7, 8, 9)) res0: IndexedSeq [IndexedSeq [Int]] = Вектор (Вектор (1, 2, 3), Вектор (4, 5), Вектор (6, 7, 8, 9))
Вы можете динамически создать массив из двух димов следующим образом:
val aa : Array[Array[Int]] = Array.ofDim (3, 4)
Ну да, понятно, размер фиксированный. Как насчет этого:
val i = random.nextInt (5) + 1
val j = new GregorianCalendar (). get (Calendar.DAY_OF_WEEK)
val aa : Array[Array[Int]] = Array.ofDim (i, j)
Да, это связано с двумя измерениями. Как бы вы использовали массив неизвестного ранее размера?
Ну, по крайней мере, вы можете:
val aa : Array [Int] = Array.ofDim (2)
aa: Array [Int] = Array (0, 0)
val aaa = Array.fill (3) (aa)
aaa: Array [Array [Int]]] = Array (Array (0, 0), Array (0, 0), массив (0, 0))