scala动态多维可变数组,如数据结构

时间:2010-08-19 23:38:28

标签: scala types

有没有办法在Scala中构建动态多维数组?我知道Scala中的数组必须按其大小和尺寸进行初始化,所以我不希望这样。数据结构应该是动态的。我尝试使用列表中的列表来构建它,但我在某种程度上迷失了自己。

有很多不同的类型,也许我找不到合适的类型。所以请把我推向正确的方向。

3 个答案:

答案 0 :(得分:8)

如果你想做类似

的事情

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

答案 1 :(得分:4)

嗯,这很大程度上取决于你打算用它做什么,但最好的猜测是IndexedSeq[IndexedSeq[T]](或更深的嵌套),使用Vector作为IndexedSeq的实现(无论如何它都是默认的实现。)

例如:

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

答案 2 :(得分:3)

您可以动态创建一个包含2个dims的数组:

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