ヨージとプログラミング

プログラミング勉強の記録

【Ruby】配列の統合(flatten)と分割(each_slice)

paizaやるときに調べたシリーズ

行列(marix)の操作の時に使用した

数学ではおなじみ行列
以下のような3行3列の行列があったとする
1 2 3
4 5 6
7 8 9
私の浅知恵では、これをプログラムで扱うとすると、配列で入れ子にするのがいいんじゃないかと思うわけです。

# こんな感じ
matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
# 2行目の2列目の要素を取り出したい時は
matrix_22 = matrix[1][1]

詳しい文脈は割愛しまして、配列の入れ子が邪魔な時もありまして、一旦、1つの配列にしてしまいたいと思いました。それについてはflattenメソッドがあることは知っていましたが、一度flattenしてしまってもとに戻せるの?ってなりましたが、どうやら行けそうです。

flatten <==> each_slice

使い方

matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
# flatten
matrix.flatten
   # => [1, 2, 3, 4, 5, 6, 7, 8, 9]
p matrix
   # =>  [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] flattenは非破壊メソッド
matrix.flatten!
p matrix
   # => [1, 2, 3, 4, 5, 6, 7, 8, 9] "!"をつけて破壊的に

matrix.each_slice(3)
   # => #<Enumerator: [1, 2, 3, 4, 5, 6, 7, 8, 9]:each_slice(3)>
   # イミュータブルなものが帰ってくるので必ずto_aする
matrix.each_slice(3).to_a
   # => [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
p matrix
   # => [1, 2, 3, 4, 5, 6, 7, 8, 9]  each_sliceは非破壊

each_sliceは非破壊メソッドですが、each_slice! とか、each_slice(3)!とかeach_slice(3).to_a!とかは総じてエラーになったので破壊的にはできないのかなぁ