2009-10-04 3 views

ответ

4

Просто суммировать по индексам.

(0...a.size).inject(0) { |sum, index| if index != (i - 1) then sum + my_array[i] else sum } 
+0

Спасибо, но, похоже, что есть более простой способ: my_arr.inject {| Р.С., пункт | rs + = item, если my_arr.index (item)! = 0} – gmile

+1

Но более простой способ, который вы предположили, опасен с повторяющимися элементами и гораздо менее результативным - для поиска элемента требуется O (n). – Dario

2

использование index метод массива:

>> arr = ['a','b', 'c','a'] 
=> ["a", "b", "c", "a"] 
>> arr.index('a') 
=> 0 
>> arr.index('b') 
=> 1 
3

Вам нужно будет написать свой собственный (даже в Ruby 1.9, так как инъекция не возвращает итератор).

module Enumerable 
    def inject_with_index(injected) 
    each_with_index {|value, index| injected = yield(injected, value, index)} 
    injected 
    end 
end 

Edit: Если вы переключитесь inject и each_with_index вокруг (! Благодаря комментатора), вы можете сделать это без нового метода:

["a", "b", "c"].each_with_index.inject("") do |result, (value, index)| 
    index != 1 ? result + value : result 
end 

Убедитесь в том, чтобы вернуться только result, если вы хотите, чтобы исключить Значение. Это также относится к первому методу.

+2

'each_with_index.inject' отлично работает в 1.8.7+ – sepp2k

+0

Вы правы, я не думал об переключении обоих. Но вы должны поставить аргументы в круглые скобки. – gix

2

Вы можете вынуть деталь вы не хотите первый:

my_array.values_at(0...i,(i+1)..-1).inject {|rs,item| rs += item} 
+0

Лучшее решение, я думаю – Dario