2009/06/15

Rubyで配列から特定の要素のindexを全て取得する方法

先日の北海道開発オフ中、こんな質問をTwitterにしてみました。


すると@elimさん、@mrknさんが検討してくれた結果、こんな回答を。@elimさん、@mrknさん、ありがとう!


先生!難しくてよくわかりません!
なので、Enumerable - Rubyリファレンスマニュアルを見ながら考えてみます。

[1,2,3,1,2].each_with_index.select{|x| x[0] == 1}.map{|x| x[1]}

each_with_indexは、要素とindexを取得しながら回します。上記だと配列"[1,2,3,1,2]"を、要素とindexを配列として取得して返しますので、"[1,0],[2,1][3,2][1,3][2,4]"と返していきます。
selectは、ブロックを評価して真である場合は配列を返します。"x[0]"は要素にあたるので、要素が1の場合配列を返すことになります。今回は"[1,0]"と[1,3]"が返ります。
mapはブロックを評価した結果を含む配列を返します。"x[1]"はindexにあたるので、selectで返された"[1,0]"と[1,3]"のindex部"0"と"3"が配列として返ります。
結果、返り値は"[0,3]"になります。

ってことで良いんだと思うんですが、勉強不足の僕は知らないことがいっぱいあります。やっぱり逆引きRuby買わなきゃだなぁ。

Ruby逆引きハンドブック
るびきち
シーアンドアール研究所
売り上げランキング: 640