2012-10-12 2 views
13

불변의 인덱스 된 다차원 배열로 작업하고 싶습니다. 의미가있는 구조는 VectorVector입니다.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)) 

당신이 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)) 

그러나, Vector.ofDim 기능은 없으며 동일한 기능을 찾을 수 없습니다.

변경할 수없는 개체에 해당하는 Array.ofDim이 있습니까? 그렇지 않다면 왜 안 되겠습니까?

+0

스도쿠 퍼즐을 해결하는 프로그램입니다. 부분 해는'Option [Int]'의 nxn 배열로 표현된다. 부분적인 솔루션 _p_가 주어지면, 프로그램은 정수를 배열에 넣음으로써 또 다른 하나의 가설을 가정 할 수 있습니다. 각 _p_가 여러 개의 _p'_를 생성 할 수 있으므로 각 부분 솔루션을 변경하지 못하게하고 싶습니다. 내 옵션은 다음 중 하나 인 것으로 보입니다. 1) 개인 '배열'로 숫자를 표현하십시오. 2) 숫자로 '벡터'를 표시하십시오. (2)는 기능적 스타일에서 더 많이 보이지만, '벡터'를 만드는 것은 어색하다. –

+0

단일 차원을 사용하여 다차원 배열/목록을 나타낼 수 있습니다. – pedrofurla

+1

다차원 벡터에서 셀을 업데이트하는 데 약간의 준비를하십시오. 아마도 가장 쉬운 방법은 유틸리티 메소드를 가지는 것입니다 : def update [T] (v : Vector [Vector]) (c1 : Int, c2 : Int) (newVal : T) = v.updated (c1, v (c1) .updated (c2, newVal))'. 또는 http://stackoverflow.com/a/12612908/770361에서 더 높은 차원의 복사하여 붙여 넣기가 필요한 경우 –

답변

18

각각의 표준 컬렉션 클래스는 fill을 포함 팩토리 메소드와 동반자 개체가 있습니다. 예 :

Vector.fill(3, 3)(0) 

the relevant scaladoc을 참조하십시오.

+0

링크는 404를 제공합니다. 현재 링크는 (2016-11-25)입니다 : http://www.scala-lang.org/api/current/scala/collection/immutable/Vector.html – eddy147

+0

링크를 업데이트했습니다. SO에 의해 심하게 파싱 됨). 현재 scaladoc은'fill '을 언급하지 않았으므로 scala 2.9.1을 고수했습니다. –

+0

왜 볼 수 없는지 잘 모르겠지만 '채우기'가 있고 오랫동안있었습니다 : http://www.scala-lang.org/api/current/scala/collection/immutable/Vector$ .html # fill [A] (n1 : int, n2 : Int) (elem : => A) : CC [CC [A]] 물론 객체의 동반입니다. –

5

당신은 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

인덱스를 기반으로 내용을 설정할 수 있습니다 tabulate라는 생성 방법이 있습니다 :

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

그냥 제로 (또는 다른 상수)이 필요한 경우, 대신 fill를 사용할 수 있습니다

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)) 
관련 문제