ブロックを使用して要素を検索し、そのインデックスを返すことができる Array または Enumerable ビルトインはありますか?
の行に沿った何か:
ar = [15,2,33,4,50,69]
indexes = ar.find_indexes {|item| item > 4 == 0}
# indexes will now contain 0,2,4,5
自分で追加するのはとても簡単ですが、これが既に存在するかどうか知りたいですか?
ブロックを使用して要素を検索し、そのインデックスを返すことができる Array または Enumerable ビルトインはありますか?
の行に沿った何か:
ar = [15,2,33,4,50,69]
indexes = ar.find_indexes {|item| item > 4 == 0}
# indexes will now contain 0,2,4,5
自分で追加するのはとても簡単ですが、これが既に存在するかどうか知りたいですか?
組み込みのものは何もないと思います。少なくとも、以前はArrayまたはEnumerableのドキュメントで検出されなかったものに気づきませんでした。
ただし、これはかなり簡潔です。
(0..ar.size-1).select { |i| ar[i] > 4 }
編集: これは Ruby 1.8.6 であると言及する必要がありました。
別の編集:キャラクター全体を保存するトリプルドットを忘れ、-1
快適ではなかった をクリーンアップしました:
(0...ar.size).select { |i| ar[i] > 4 }
これはruby 1.9のみであることを理解しています
indexes = ar.collect.with_index { |elem, index| index if elem > 4 }.
select { |elem| not elem.nil? }
編集:ルビー1.8の場合
require 'enumerator'
indexes = ar.to_enum(:each_with_index).
collect { |elem, index| index if elem > 4 }.
select { |elem| not elem.nil? }
いいえ。ただし、必要に応じていつでもモンキーパッチを適用できます。
class Array
def find_indexes(&block)
(0..size-1).select { |i| block.call(self[i]) }
end
end
ar = [15,2,33,4,50,69]
p ar.find_indexes {|item| item > 4 } #=> [0, 2, 4, 5]
インジェクトメソッドの力を爆発させましょう!!! ;-)
ar.inject([]){|a,i| a.empty? ? a << [0, i] : a << [a.last[0]+1,i]}
.select{|a| a[1] > 4}
.map{|a| a[0]}
(ruby 1.8.6 で動作)
それは本質的に、い範囲を削除するために再フォーマットされたMike Woodhouseの答えです。
ar.each_index.select{|item| item > 4}
Ruby 1.8.7で動作するjohnanthonyboydの回答のバージョンは次のとおりです
ar.enum_with_index.each.select{|item| item.first > 4}.map(&:last)