有没有办法在Scala中构建动态多维数组?我知道Scala中的数组必须按其大小和尺寸进行初始化,所以我不希望这样。数据结构应该是动态的。我尝试使用列表中的列表来构建它,但我在某种程度上迷失了自己。
有很多不同的类型,也许我找不到合适的类型。所以请把我推向正确的方向。
答案 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))