Как получить Массив Индекса вхождений того же элемента в Массив - PullRequest
1 голос
/ 04 августа 2010

Ввод: [1,2,2,3,4,2]

Выход: индекс 2 = [1,2,5]

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

Хороший, однострочный, чистый ответ зависит от того, какую версию Ruby вы используете.Для 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
3 голосов
/ 04 августа 2010

Легко с find_all:

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

Примечание : при использовании Ruby 1.8.6 вы можете require 'backports/1.8.7/enumerable/find_all'

3 голосов
/ 04 августа 2010

Метод, подобный этому:

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

Дает вам следующее:

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)
=> []

Я уверен, что есть способ сделать это одним вкладышем (всегда, кажется,!) но это сделает работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...