私はScalaの多次元コレクションを扱うためのエレガントな方法を探しています。私の理解では、私は、次の2次元配列の場合のように、集計使用して5次元のコレクションまで持つことができるということです。コレクションの寸法と効率的でエレガントな方法でコレクションをトラバースする方法
val test = Array.tabulate[Double](row,col)(_+_)
と私が使用して配列の要素にアクセスできることを
for(i<-0 until row) {
for(j<-0 until col) {
test(i)(j) = 0.0
}
}
私は私のような何かをせずに、コレクションの構造を決定し、それにまたがるの簡潔な方法であるかもしれないものを、ハンドリングするつもりだ何先験的がわからない場合:
case(Array(x)) =>
for(i<-1 until dim1) {
test(i) = 0.0
}
case(Array(x,y)) =>
for(i<-1 until dim1) {
for(j<-1 until dim2) {
test(i)(j) = 0.0
}
}
case(Array(x,y,z)) =>
...
寸法値n1、n2、n3などはプライベートですね。また、1つのケースでトラバーサルを処理したい場合は、n次元オブジェクトを扱うときに、1次元ベクトルに2次元配列をアンラップする同じトリックを使用しますか?
事前に感謝
ブルース
ありがとう、これは私の理解に役立ちます。 –
私はあなたの考えが「地図を使うのがはるかに簡単で、不変だったかのように配列を使って作業する方が簡単ですが、元の要求の精神に反しているように思えます。に..."。 –
@ Bruce - 慣用的なScalaでは、通常、コレクション全体を変換する方法があります。ですから、何らかの形の多次元コレクションから始まり、(mapのような)操作を適用して、元のまま変更されたコレクションになります。すべてが不変なので、これは実際にはかなり効率的です。このような構造のセルを1つだけ変更すると、新しいフォームのすべての行(変更がある行を除く)が元の行への参照になります。これは変更できないという保証があるため可能です。 –