Scala динамические многомерные изменяемые массивы, такие как структуры данных - PullRequest
9 голосов
/ 20 августа 2010

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

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

Ответы [ 3 ]

7 голосов
/ 20 августа 2010

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

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))
4 голосов
/ 20 августа 2010

Вы можете динамически создать массив из 2 димов, например:

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), Array (0, 0))

4 голосов
/ 20 августа 2010

Ну, это во многом зависит от того, что вы собираетесь с ним делать, но ваш лучший выбор - IndexedSeq[IndexedSeq[T]] (или более глубокие вложения), используя Vector в качестве реализации для 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))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...