2010-08-04 3 views

Répondre

3

Une méthode comme ceci:

def indexes_of_occurrence(ary, occ) 
    indexes = [] 
    ary.each_with_index do |item, i| 
    if item == occ 
     indexes << i 
    end 
    end 
    return indexes 
end 

vous donne les suivantes :

irb(main):048:0> indexes_for_occurrence(a, 2) 
=> [1, 2, 5] 
irb(main):049:0> indexes_for_occurrence(a, 1) 
=> [0] 
irb(main):050:0> indexes_for_occurrence(a, 7) 
=> [] 

Je suis sûr qu'il y a un moyen de le faire un seul (il y a les moyens semblent être!) mais cela fera l'affaire.

3

Une bonne réponse, une seule ligne, dépend de la version de Ruby que vous utilisez. 1,8:

require 'enumerator' 
foo = [1,2,2,3,4,2] 
foo.to_enum(:each_with_index).collect{|x,i| i if x == 2 }.compact 

1,9:

foo = [1,2,2,3,4,2] 
foo.collect.with_index {|x,i| i if x == 2}.compact 
+1

Vous pouvez faire .compacter au lieu de .reject {| x | x.nil? } ce qui le rendrait plus court. – Shadwell

+0

Bonne prise. J'ai édité pour refléter votre suggestion, merci Shadwell :) – animal

3

facile avec find_all:

[1,2,2,3,4,2].each_with_index.find_all{|val, i| val == 2}.map(&:last) # => [1, 2, 5] 

Remarque: Si vous utilisez Ruby 1.8.6, vous pouvez require 'backports/1.8.7/enumerable/find_all'

Questions connexes