2014-08-31 3 views
1

ofdim을 사용하여 scala에서 다차원 배열을 만드는 방법에 대해 읽었지만 모든 배열의 크기가 같지 않게하려면 어떻게해야합니까? 다음과 같은 다양한 크기의 배열을 만들 수는 있지만 아무 것도 찾을 수 없었습니다.Scala의 배열의 다원 배열 배열

dist = [[1,2,3], 
     [10, 11, 13, 15, 16, 17, 19], 
     [25]] 
+0

다양한 길이 또는 크기의 배열 배열? –

+0

다양한 길이의 배열 배열. 항목을 저장소에 넣을 때 사용합니다. 히스토그램 만들기와 같습니다. – vyruz

답변

1

당신은 항상 tabulate를 사용하여 다음 인덱스에 기초하여 원하는 크기를 구축하거나, 배열 자체에 크기 목록에서 매핑 할 수 있습니다 :

Array.tabulate(4)(i => Array.range(0,i)) 
// Array[Array[Int]] = Array(Array(), Array(0), Array(0, 1), Array(0, 1, 2)) 

Array(3,7,1).map(i => Array.range(0,i)) 
// Array[Array[Int]] = Array(Array(0, 1, 2), Array(0, 1, 2, 3, 4, 5, 6), Array(0)) 

는 JVM은 없습니다 진정한 다차원 배열, 배열의 배열 - 그래서 스칼라도 않습니다. 할 수있는 한 자유롭게 구축하십시오.

+0

왜 var hist = Array.tabulate (9) (i => Array (0))를 사용하고 hist를 인쇄하려고 할 때 [[I @ 5b895cb9 – vyruz

+0

@vyruz -'Array'는' toString' 메소드를 호출합니다. REPL은 단순히'toString'을 호출하는 것이 아니라 자체 인쇄 루틴을 호출합니다; 당신은 println (hist.map (_. mkString (",")). mkString ("\ n"))'또는 일부 요소를 볼 수 있습니다. –

0

이 배열 [List [Int]]와 같은 목록의 배열로 이동하는 것이 좋습니다. 내부 목록은 필요에 따라 가변 길이가 될 수 있습니다. 또는 목록의 목록, 외부 배열의 길이를 미리 알 수없는 경우.

0

하면

에 대한

def histo(bounds: Array[Int], data: Array[Int]): Array[Array[Int]] = { 
    bounds match { 
    case Array(h)  => Array(data) 
    case Array(h, t @ _*) => val (l,r) = data.partition(_ < h) 
          l +: histo(t.toArray,r) 
    } 
} 

따라서,이 같은 partition의 반복 사용 (https://stackoverflow.com/a/24540089/3189923 내 전체 관련, 대답을 참조), 고려 히스토그램을 구축하기위한 컬렉션에서 값을 비닝 에 고려

val bounds = Array(10, 20, 30) val dist = Array(1, 2, 3, 10, 11, 13, 15, 16, 17, 19, 25) 

우리가 그

histo(bounds, dist) 
res: Array[Array[Int]] = Array(Array(1, 2, 3), 
           Array(10, 11, 13, 15, 16, 17, 19), 
           Array(25))