希望の列インデックスを取り、それらの列だけを持つ2次元配列を返す2次元配列をフィルタリングしたいと思います。空の配列を除いて、私は同じ2次元配列を返したいと思います。副作用のない2次元配列をフィルタリングする
また、元の配列を変更したくないので、if文を使わずにコードを書いたり、できるだけ分岐を制限したりしたいと思います。
Marshal#load
とMarshal#dump
に冗長であり、#map!
を使用しているのでしょうか。
私が#map!
を使用した理由は、if..else..end
ブロックを使用する必要はありませんが、私は他の戦略を学ぶことに興味があります。
def keep_columns args
matrix = Marshal.load Marshal.dump args[:matrix]
columns = args[:columns]
matrix.map! do |row|
row.select.with_index { |_,idx| columns.include? idx }
end unless columns.empty?
matrix
end
matrix = [['foo','bar', 'baz'],['cats', 'and', 'dogs']]
keep_columns matrix: matrix, columns: [0,2]
#=> [["foo", "baz"], ["cats", "dogs"]]
keep_columns matrix: matrix, columns: []
#=> [["foo", "bar", "baz"], ["cats", "and", "dogs"]]
+1私の投票権があるときは、プロのヒントのために+1します。あなたは例を挙げることができますか?また、あなたのテクニック 'matrix.dup.map(&:dup)'が[この質問]に当てはまると思いますか?(http://stackoverflow.com/questions/41657091/use-replace-to-make-a-copy -of-an-array)? – mbigras
その質問には1次元配列しかありません。 'matrix.map(&:dup)'の2次元配列が正しい場合、マーシャリングコードは、実際には起こりたくない行列の要素も複製します。 – akuhn
ありがとう@akuhn! '(columns)'を '(* columns)'に変更できますか? :) – mbigras