scala динамические многомерные изменяемые массивы, такие как структуры данных

Есть ли способ построить динамические многомерные массивы в Scala? Я знаю, что массивы в Scala должны быть инициализированы по размерам и размерам, поэтому я не хочу этого. Структура данных должна быть динамичной. Я пытался создать его из списков в списках, но я каким-то образом потерял себя.

Существует так много разных типов, может быть, я просто не нашел подходящий. Поэтому, пожалуйста, подтолкните меня в правильном направлении.

9
задан Christian Neverdal 27 January 2013 в 13:39
поделиться

3 ответа

Если вы хотите сделать что-то вроде

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))
7
ответ дан 4 December 2019 в 13:44
поделиться

Ну, это во многом зависит от того, что вы собираетесь с ним делать, но лучше всего предположить 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))

4
ответ дан 4 December 2019 в 13:44
поделиться

Вы можете динамически создать массив из двух димов следующим образом:

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))

4
ответ дан 4 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: