3

ブロックを使用して要素を検索し、そのインデックスを返すことができる 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

自分で追加するのはとても簡単ですが、これが既に存在するかどうか知りたいですか?

4

5 に答える 5

7

組み込みのものは何もないと思います。少なくとも、以前はArrayまたはEnumerableのドキュメントで検出されなかったものに気づきませんでした。

ただし、これはかなり簡潔です。

(0..ar.size-1).select { |i| ar[i] > 4 }

編集: これは Ruby 1.8.6 であると言及する必要がありました。

別の編集:キャラクター全体を保存するトリプルドットを忘れ、-1快適ではなかった をクリーンアップしました:

(0...ar.size).select { |i| ar[i] > 4 }
于 2009-11-10T09:13:33.840 に答える
3

これは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? }
于 2009-11-10T10:05:09.790 に答える
1

いいえ。ただし、必要に応じていつでもモンキーパッチを適用できます。

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]                                                        
于 2009-11-10T16:32:27.840 に答える
1

インジェクトメソッドの力を爆発させましょう!!! ;-)

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 で動作)

于 2009-11-10T16:21:41.583 に答える
0

それは本質的に、い範囲を削除するために再フォーマットされた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)
于 2009-11-10T13:37:56.500 に答える