Rubyレシピブック その①(配列)
読書記録兼コード晒し
ショボいけど書かずに覚えないくらいなら俺はコードを晒す!
Rubyレシピブック読んでます
構文とかその辺なんてわかってるので、とにかくメソッドを頭に叩き込んで不自由なくコードを書くレベルに達するまでを目標にしています。毎日数十分レシピブックで写経することをノックと呼び、ある程度習慣付けしております。
- 作者: 青木峰郎,後藤裕蔵,高橋征義,まつもとゆきひろ
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2010/08/28
- メディア: 単行本
- 購入: 5人 クリック: 83回
- この商品を含むブログ (32件) を見る
そのなかでもArrayクラスのメソッドいろいろまとめ
配列のインデックスと要素のペアを取得する
配列要素を1つ1つ取るにはおなじみeachメソッドです。
正義の味方eachメソッド
irb(main):192:0> ary => [1, 2, 3, 4, 5] irb(main):156:0> ary.each { |n| p n } 1 2 3 4 5
でもインデックスとか付けたいし。って時に使うのがeach_with_indexメソッドを使うと便利です。
irb(main):159:0> ary.each_with_index { | n, idx | p "#{idx} : #{n}" } "0 : 1" "1 : 2" "2 : 3" "3 : 4" "4 : 5"
配列の重複した文字数を取得する
配列の重複文字をカウントします。Hashを使います。
irb(main):189:0> cont = Hash.new(0) => {} irb(main):190:0> array.each { |str| cont[str] += 1 } => ["1", "2", "2", "3", "4", "3", "4", "1", "1", "1"] irb(main):191:0> cont => {"1"=>4, "2"=>2, "3"=>2, "4"=>2}
テキストにある通りHash.new(0)って引数を0に取らないとエラー出ます。
配列の組み合わせ(重複を許す)の抽出
重複を許す場合はpermutationメソッド。配列に変換することを忘れないこと。忘れるとEnumeratorクラスが返されるだけです。
irb(main):199:0> array => ["1", "2", "2", "3", "4", "3", "4", "1", "1", "1"] irb(main):200:0> array.permutation(2).to_a => [["1", "2"], ["1", "2"], ["1", "3"], ["1", "4"], ["1", "3"], ["1", "4"], ["1", "1"], ["1", "1"], ["1", "1"], ["2", "1"], ["2", "2"], ["2", "3"], ["2", "4"], ["2", "3"], ["2", "4"], ["2", "1"], ["2", "1"], ["2", "1"], ["2", "1"], ["2", "2"], ["2", "3"], ["2", "4"], ["2", "3"], ["2", "4"], ["2", "1"], ["2", "1"], ["2", "1"], ["3", "1"], ["3", "2"], ["3", "2"], ["3", "4"], ["3", "3"], ["3", "4"], ["3", "1"], ["3", "1"], ["3", "1"], ["4", "1"], ["4", "2"], ["4", "2"], ["4", "3"], ["4", "3"], ["4", "4"], ["4", "1"], ["4", "1"], ["4", "1"], ["3", "1"], ["3", "2"], ["3", "2"], ["3", "3"], ["3", "4"], ["3", "4"], ["3", "1"], ["3", "1"], ["3", "1"], ["4", "1"], ["4", "2"], ["4", "2"], ["4", "3"], ["4", "4"], ["4", "3"], ["4", "1"], ["4", "1"], ["4", "1"], ["1", "1"], ["1", "2"], ["1", "2"], ["1", "3"], ["1", "4"], ["1", "3"], ["1", "4"], ["1", "1"], ["1", "1"], ["1", "1"], ["1", "2"], ["1", "2"], ["1", "3"], ["1", "4"], ["1", "3"], ["1", "4"], ["1", "1"], ["1", "1"], ["1", "1"], ["1", "2"], ["1", "2"], ["1", "3"], ["1", "4"], ["1", "3"], ["1", "4"], ["1", "1"], ["1", "1"]]
ちなみに重複を許さない場合はcombination
irb(main):204:0> array.combination(2).to_a => [["1", "2"], ["1", "2"], ["1", "3"], ["1", "4"], ["1", "3"], ["1", "4"], ["1", "1"], ["1", "1"], ["1", "1"], ["2", "2"], ["2", "3"], ["2", "4"], ["2", "3"], ["2", "4"], ["2", "1"], ["2", "1"], ["2", "1"], ["2", "3"], ["2", "4"], ["2", "3"], ["2", "4"], ["2", "1"], ["2", "1"], ["2", "1"], ["3", "4"], ["3", "3"], ["3", "4"], ["3", "1"], ["3", "1"], ["3", "1"], ["4", "3"], ["4", "4"], ["4", "1"], ["4", "1"], ["4", "1"], ["3", "4"], ["3", "1"], ["3", "1"], ["3", "1"], ["4", "1"], ["4", "1"], ["4", "1"], ["1", "1"], ["1", "1"], ["1", "1"]]
たしかに上2つの小見出しに似た処理はよくみるなあ。