こんにちは。はるぐちです。フィヨルドブートキャンプで学習中です。 今回は二次元配列について考えてみました。 普通の配列については以前こんな記事を書いたので参考にしてください。
二次元配列って?
二次元配列とは配列の中に入れ子になって配列がある配列(何言ってるかよくわからん)です。ネストの深さによっては「多次元配列」や「多重配列」と言ったりもしますが正式な名前がなんなのかは知りません。教えてください。
たとえばこんな感じ。
# 二次元配列
[ [ , ], [ , ], [ , , ] ]
ネストが深くなればなるほど自分が今どんな操作をやっているのかわからなくなってくるので難しいですよね。 この二次元配列についていろんな操作を考えてみたいと思います。 書き出してみたら思いのほか長くなったので、何回かに分けて記事にしたいと思います。記事稼ぎです。
1.配列の中の文字列に対して最大の文字数を取得する
こんな二次元配列を用意します。
word_groups = [ ["monkey", "gorilla", "orangutan"], ["hawk", "woodpecker", "goose"], ["dlphin", "shark", "haruguchi"] ]
この中から最大の文字数を取得します。期待される結果はwoodpecker
の文字数で10
です!
結論
まずは結論から。アプローチを2つ考えました。
- ループを回しながら探していくパターン
- 配列を平坦化して考えるパターン
# ループを回しながら探すパターン word_groups.map{ |words| words.map(&:size).max }.max #=> 10 ### 配列を平坦化するパターン word_groups.flatten.map(&:size).max #=> 10
解説
メソッドチェーンが多くてわかりにくいのでいくつかのステップに分けて考えていきます。
ループを回すパターンの方
word_groups.map{ |words| words } #=> ["monkey", "gorilla", "orangutan"], #=> ["hawk", "woodpecker", "goose"], #=> ["dlphin", "shark", "haruguchi"]
1回目のmapでは配列の要素(内側の配列)を1つずつ取り出しています。この内側の配列に対してmapメソッドを使って要素の('monkey'とかの文字列)文字数を確認していきます。
word_groups.map{ |words| words.map(&:size) } #=> [6, 7, 9] #=> [4, 10, 5] #=> [6, 5, 9]
これで各配列での文字数が取得できました。
次に、その配列に対して最大値をとってきます。最大値を返すメソッドはmax
メソッドです。maxメソッドの場所に注意します。
word_groups.map{ |words| words.map(&:size).max } #=> [9, 10, 9]
できました。
次に、内側の配列に対して最大値を取得したいので、max
はmap
の内側に記述します。
これでそれぞれの配列での最大文字数が取得できました。
あとはその中からさらに最大値をとってくるだけです。
word_groups.map{ |words| words.map(&:size).max }.max #=> 10
慣れるまではイメージしづらいかも知れません、、、
配列を平坦化するパターン
こちらはもっとシンプルな考え方になります。
まずflatten
メソッドを使って二次元配列のネストをとっぱらい、普通の配列に変換します。
word_proups.flatten
#=> ["monkey", "gorilla", "orangutan", "hawk", "woodpecker", "goose", "dlphin", "shark", "haruguchi"]
次に、文字列を文字数に変換します。
word_groups.flatten.map(&:size) #=> [6, 7, 9, 4, 10, 5, 6, 5, 9]
それぞれの単語の文字数が出ました。そして、その中から最大値を取得すれば終わりです。
word_groups.flatten.map(&:size).max #=> 10
ループを回すより考えやすかったと思います!
次回は値が入った二次元配列の合計値を計算するです。