2015-07-30 1 views
2

Как вернуть все значение индекса элементов в массиве с одинаковыми строковыми значениями в них?В Ruby, как мне вернуть все значение индекса элементов в массиве с одинаковыми строковыми значениями в них?

Например:

myarray=[tree, bean, bean, bunny, frog, bean, soup] 

Если бы я искал «боб», используя что-то myarray.index(bean) он вернется 1. Если бы я сделал то же поиск, используя myarray.rindex(bean) это возвращение будет 5.

мне нужен метод до myarray.{does this method exist?}(bean), который вернет [1, 2, 5].

Любые предложения?

+1

Я думаю, что я только что нашел решение http://stackoverflow.com/questions/13659696/find-index-of-elements-that-match-a-given-condition –

+0

Хороший вопрос, чтобы спросить, почему * вы хотите это знать. Вы пытаетесь удалить дубликаты? На вопрос есть немного проблемы [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

+0

Каковы значения 'tree',' bean' и т. Д.? – sawa

ответ

1

Вы можете использовать #each_with_index (создать пару строки, индекс), затем #map (итерация по парам, и если они совпадают, то возвращать индекс, в противном случае возвращает ноль) и, наконец, #compact (удалить нулевые значения) массив.

myarray.each_with_index.map{|x,i| x == "bean"? i : nil}.compact 

Немного проще soulution и лучше один также с точки зрения эффективности будет, вероятно, это один с #each_index.

myarray.each_index.select{|x| myarray[x] == "bean"} 

КПП. вы должны указать переменную my_array, а не myarray.

+1

При использовании 'map', не возвращайте nils в блок, а затем используйте' compact'. Это тратит процессор и память, особенно для больших массивов. Вы можете сделать то же самое, указав пустой массив, затем используя 'each' и добавляя к массиву внутри блока, затем получите доступ к массиву, за исключением того, что он не будет тратить процессор или память. –

+0

спасибо Tin Man за советы, вы совершенно правы – adamliesko

+0

Я предлагаю 'select' вместо' map'. –

0

Простой & легко понять решение приводится ниже

myarray = [:tree, :bean, :bean, :bunny, :frog, :bean, :soup] 

result = [] 
search_for = :bean 

myarray.each_with_index() { |element, index| result << index if element == search_for } 

p result 

Выход

[1, 2, 5]