2012-10-12 15 views
13

Chcę pracować z niezmienną indeksowaną tablicą wielowymiarową. Struktura mająca sens to Vector s. Vector.Jak tworzyć wielowymiarowe wektory w Scali?

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

Byłoby miło, aby utworzyć pustą tablicę przez podanie wymiarów, jak można z 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)) 

Jednak nie ma Vector.ofDim, funkcja, i nie mogę znaleźć odpowiednika.

Czy istnieje odpowiednik Array.ofDim dla obiektów niezmiennych? Jeśli nie, dlaczego nie?

+0

Jest to program, który rozwiązuje łamigłówki Sudoku. Częściowe rozwiązanie jest reprezentowane jako tablica nxn z 'Option [Int]'. Biorąc pod uwagę częściowe rozwiązanie _p_, program może postawić hipotezę innego _p'_ poprzez wprowadzenie liczb całkowitych do tablicy. Ponieważ każde _p_ może generować wiele _p'_s, chcę aby każde częściowe rozwiązanie było niezmienne. Moje opcje wydają się być 1) reprezentują liczby z prywatnym 'Tablicą' 2) reprezentują liczby z' Vector'. (2) wydaje się bardziej w stylu funkcjonalnym, ale tworzenie 'Vector's' Vector's jest niezręczne. –

+0

Możesz reprezentować wielowymiarowe tablice/listy używając pojedynczych wymiarów. – pedrofurla

+1

Przygotuj się na zabawę, próbując zaktualizować komórki w wielowymiarowym wektorze. Prawdopodobnie najłatwiej jest mieć metodę użyteczności: 'def update [T] (v: Vector [Vector [T]]) (c1: Int, c2: Int) (newVal: T) = v.updated (c1, v (c1) .aktualizowane (c2, nowaWartość)) '. Lub jeśli potrzebujesz wyższych wymiarów, skopiuj i wklej z http://stackoverflow.com/a/12612908/770361. –

Odpowiedz

18

Każda klasa średnia kolekcja posiada obiekt towarzysz metod fabrycznych, w tym fill. Na przykład:

Vector.fill(3, 3)(0) 

Zobacz the relevant scaladoc.

+0

Link daje 404. Obecny link to (2016-11-25): http://www.scala-lang.org/api/current/scala/collection/immutable/Vector.html – eddy147

+0

Zaktualizowałem link (to było po prostu źle przetworzone przez SO). Okazuje się, że obecny skaladoc wciąż nie wspomina o "wypełnieniu", więc utknąłem na scala 2.9.1. –

+0

Nie wiem, dlaczego go nie widzisz, ale "wypełnij" jest tam i trwało długo: http://www.scala-lang.org/api/current/scala/collection/immutable/Vector$ .html # wypełnij [A] (n1: Int, n2: Int) (elem: => A): CC [CC [A]] Jest w obiekcie towarzyszącym, oczywiście –

5

Można użyć 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

Jest to metoda tworzenia nazywa tabulate, który pozwala ustawić zawartość na podstawie indeksu:

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

Jeśli wystarczy zera (lub innej stałej), można użyć fill zamiast:

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