【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!とかは総じてエラーになったので破壊的にはできないのかなぁ