Scala: 2次元配列を転置する方法
要素数 M×N の 2次元配列 A に対して、Aij=Bji(1≤i≤M,1≤j≤N) となるような
N×M の2次元配列 B=AT を作成したい。
Scala の Array クラスには、そのものズバリ transpose というメソッドがある。
1 2 3 4 5 | scala> val a = Array(Array( 1 , 2 , 3 ),Array( 4 , 5 , 6 ),Array( 7 , 8 , 9 ),Array( 10 , 11 , 12 )) a : Array[Array[Int]] = Array(Array( 1 , 2 , 3 ), Array( 4 , 5 , 6 ), Array( 7 , 8 , 9 ), Array( 10 , 11 , 12 )) scala> a.transpose res 0 : Array[Array[Int]] = Array(Array( 1 , 4 , 7 , 10 ), Array( 2 , 5 , 8 , 11 ), Array( 3 , 6 , 9 , 12 )) |
これを利用すれば、文字列を区切って縦に結合するような処理もシンプルに記述できる。
1 2 3 4 5 6 7 8 9 10 11 12 | scala> val s = "" " | abc 123 | def 456 | " "" s : String = " abc 123 def 456 " scala> s.split( '\n' ).withFilter(! _ .isEmpty).map( _ .split( "[ ]+" )).transpose map ( _ .mkString) res 1 : Array[String] = Array(abcdef, 123456 ) |
0 件のコメント:
コメントを投稿