Условное суммирование с помощью инъекции
-
19-09-2019 - |
Вопрос
Как получить индекс элемента в:
my_array.inject {|rs,item| rs += item}
Мне нужно суммировать все, кроме i-го элемента.
Решение
Просто подведите итог по индексам.
(0...a.size).inject(0) { |sum, index| if index != (i - 1) then sum + my_array[i] else sum }
Другие советы
Вам пришлось бы написать свой собственный (даже в Ruby 1.9, поскольку inject не возвращает итератор).
module Enumerable
def inject_with_index(injected)
each_with_index {|value, index| injected = yield(injected, value, index)}
injected
end
end
Редактировать:Если вы переключитесь inject
и each_with_index
по кругу (спасибо комментатору!) вы можете сделать это без нового метода:
["a", "b", "c"].each_with_index.inject("") do |result, (value, index)|
index != 1 ? result + value : result
end
Убедитесь в том, чтобы вернуться просто result
если вы хотите исключить это значение.Это также относится к первому способу.
использование index
метод массива:
>> arr = ['a','b', 'c','a']
=> ["a", "b", "c", "a"]
>> arr.index('a')
=> 0
>> arr.index('b')
=> 1
Вы могли бы сначала вынуть тот предмет, который вам не нужен:
my_array.values_at(0...i,(i+1)..-1).inject {|rs,item| rs += item}
Не связан с StackOverflow