プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

Rubyレシピブック その①(配列)

読書記録兼コード晒し

ショボいけど書かずに覚えないくらいなら俺はコードを晒す!

Rubyレシピブック読んでます

構文とかその辺なんてわかってるので、とにかくメソッドを頭に叩き込んで不自由なくコードを書くレベルに達するまでを目標にしています。毎日数十分レシピブックで写経することをノックと呼び、ある程度習慣付けしております。

Rubyレシピブック 第3版 303の技

Rubyレシピブック 第3版 303の技

そのなかでも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つの小見出しに似た処理はよくみるなあ。