2012-10-12 6 views
13

Ich möchte mit einem unveränderlichen indizierten multidimensionalen Array arbeiten. Die Struktur, die Sinn macht, ist ein Vector von Vector s.Wie erstelle ich mehrdimensionale Vektoren in Scala?

scala> val v = Vector[Vector[Int]](Vector[Int](1,2,3), Vector[Int](4,5,6), Vector[Int](7,8,9)) 
v: scala.collection.immutable.Vector[Vector[Int]] = Vector(Vector(1, 2, 3), Vector(4, 5, 6), Vector(7, 8, 9)) 

Es wäre schön, ein leeres Array zu erstellen, indem Sie die Dimensionen spezifizieren, wie können Sie mit Array.ofDim.

scala> a = Array.ofDim[Int](3,3) 
a: Array[Array[Int]] = Array(Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0)) 

Allerdings gibt es keine Vector.ofDim, Funktion, und ich kann kein Äquivalent finden.

Gibt es ein Äquivalent von Array.ofDim für unveränderliche Objekte? Wenn nicht, warum nicht?

+0

Es ist für ein Programm, das Sudoku-Rätsel löst. Eine partielle Lösung wird als ein nxn-Array von 'Option [Int]' dargestellt. Wenn eine Teillösung _p_ gegeben ist, kann das Programm eine andere Hypothese aufstellen, indem ganze Zahlen in das Array eingefügt werden. Da jedes _p_ mehrere _p'_ s erzeugen kann, möchte ich, dass jede Teillösung unveränderlich ist. Meine Optionen scheinen entweder 1) darzustellen, die Zahlen mit einem privaten 'Array' 2) die Zahlen mit einem' Vector' darzustellen. (2) scheint mehr im funktionalen Stil zu sein, aber das Erstellen von 'Vector's von' Vector's ist peinlich. –

+0

Sie können mehrdimensionale Arrays/Listen mit einzelnen Dimensionen darstellen. – pedrofurla

+1

Bereiten Sie sich auf Spaß vor, wenn Sie versuchen, Zellen in einem mehrdimensionalen Vektor zu aktualisieren. Wahrscheinlich am einfachsten ist eine Hilfsmethode: 'def update [T] (v: Vektor [Vektor [T]]) (c1: Int, c2: Int) (neuVal: T) = v.aktualisiert (c1, v (c1) .updated (c2, newVal)) '. Oder wenn Sie höhere Dimensionen benötigen, kopieren und einfügen von http://stackoverflow.com/a/12612908/770361. –

Antwort

18

Jeder Standard Collection-Klasse hat ein Begleitobjekt mit Fabrik-Methoden, einschließlich fill. Zum Beispiel:

Vector.fill(3, 3)(0) 

Siehe the relevant scaladoc.

+0

Link gibt 404. Der aktuelle Link ist (2016-11-25): http://www.scala-lang.org/api/current/scala/collection/immutable/Vector.html – eddy147

+0

Ich aktualisierte den Link (es war nur schlecht von SO analysiert). Es stellt sich heraus, dass das aktuelle scaladoc immer noch nicht "fill" erwähnt, also bin ich bei scala 2.9.1 geblieben. –

+0

Nicht sicher, warum Sie es nicht sehen können, aber "fill" ist dort und hat für eine lange Zeit gewesen: http://www.scala-lang.org/api/current/scala/collection/immutable/Vector$ .html # fill [A] (n1: Int, n2: Int) (elem: => A): CC [CC [A]] Es ist natürlich in dem Begleitobjekt –

5

können Sie fill verwenden:

scala> Vector.fill(3)(Vector.fill(3)(0)) 
res1: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = 
     Vector(Vector(0, 0, 0), Vector(0, 0, 0), Vector(0, 0, 0)) 
13

Es gibt eine Methode zum Erstellen tabulate genannt, dass Sie die Inhalte einstellen können, basierend auf dem Index:

scala> Vector.tabulate(3,3){ (i,j) => 3*i+j+1 } 
res0: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = 
Vector(Vector(1, 2, 3), Vector(4, 5, 6), Vector(7, 8, 9)) 

Wenn Sie nur Nullen müssen (oder eine andere Konstante), können Sie fill statt:

scala> Vector.fill(3,3)(0) 
res1: scala.collection.immutable.Vector[scala.collection.immutable.Vector[Int]] = 
Vector(Vector(0, 0, 0), Vector(0, 0, 0), Vector(0, 0, 0))