2012-10-12 81 views
13

Quiero trabajar con una matriz multidimensional indexada e inmutable. La estructura que tiene sentido es Vector de Vector s.¿Cómo creo vectores multidimensionales en 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)) 

Sería bueno para crear una matriz vacía simplemente especificando las dimensiones, como se hace con 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)) 

Sin embargo, no hay Vector.ofDim, función, y no puedo encontrar un equivalente.

¿Hay un equivalente de Array.ofDim para objetos inmutables? ¿Si no, porque no?

+0

Es para un programa que resuelve los rompecabezas de Sudoku. Una solución parcial se representa como una matriz nxn de 'Opción [Int]'. Dada una solución parcial _p_, el programa puede hipotetizar otra _p'_ poniendo enteros en la matriz. Como cada _p_ puede generar múltiples _p'_ s, quiero que cada solución parcial sea inmutable. Mis opciones parecen ser 1) representar los números con un 'Array' privado 2) representar los números con un' Vector'. (2) parece más en el estilo funcional, pero crear 'Vector's de' Vector's es incómodo. –

+0

Puede representar matrices/listas multidimensionales utilizando dimensiones únicas. – pedrofurla

+1

Prepárate para divertirte intentando actualizar las celdas en un Vector multidimensional. Probablemente lo más fácil es tener un método de utilidad: 'def update [T] (v: Vector [Vector [T]]) (c1: Int, c2: Int) (newVal: T) = v.updated (c1, v (c1)) .updated (c2, newVal)) '. O si necesita dimensiones superiores, copie y pegue desde http://stackoverflow.com/a/12612908/770361. –

Respuesta

18

Cada clase de colección estándar tiene un objeto acompañante con los métodos de fábrica, incluyendo fill. Por ejemplo:

Vector.fill(3, 3)(0) 

Ver the relevant scaladoc.

+0

El enlace da 404. El enlace actual es (2016-11-25): http://www.scala-lang.org/api/current/scala/collection/immutable/Vector.html – eddy147

+0

Actualicé el enlace (era simplemente mal analizado por SO). Resulta que el scaladoc actual todavía no menciona 'fill' así que me he quedado con scala 2.9.1. –

+0

No estoy seguro de por qué no puede verlo, pero 'fill' está allí, y lo ha estado por mucho tiempo: http://www.scala-lang.org/api/current/scala/collection/immutable/Vector$ .html # fill [A] (n1: Int, n2: Int) (elem: => A): CC [CC [A]] Está en el objeto complementario, por supuesto –

5

Puede utilizar fill:

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

Hay un método de creación llamada tabulate que le permite establecer el contenido basado en el índice:

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

Si sólo tiene ceros (o alguna otra constante), se puede utilizar fill lugar:

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