Как в 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].

Какие-либо предложения?


person Shahryar Mozumder    schedule 30.07.2015    source источник
comment
Я думаю, что только что нашел решение stackoverflow.com/questions/13659696/   -  person Shahryar Mozumder    schedule 31.07.2015
comment
Хороший вопрос: почему вы хотите это знать. Вы пытаетесь удалить дубликаты? В вопросе есть немного XY-проблемы.   -  person the Tin Man    schedule 31.07.2015
comment
Каковы значения tree, bean и т. д.?   -  person sawa    schedule 31.07.2015


Ответы (2)


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

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

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

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

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

person adamliesko    schedule 30.07.2015
comment
При использовании map не возвращайте нули в блоке, а затем используйте compact. Это тратит впустую процессор и память, особенно для больших массивов. Вы можете выполнить то же самое, определив пустой массив, затем используя each и добавив к массиву внутри блока, а затем получить доступ к массиву, за исключением того, что он не будет тратить процессор или память. - person the Tin Man; 31.07.2015
comment
спасибо Железному Человеку за совет, вы совершенно правы - person adamliesko; 31.07.2015
comment
Я предлагаю select вместо map. - person Cary Swoveland; 31.07.2015

Простое и понятное решение приведено ниже

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]
person Wand Maker    schedule 31.07.2015