Есть ли эквивалент Array # find_index для последнего индекса в ruby? - PullRequest
14 голосов
/ 24 августа 2010

Array#find_index позволяет найти индекс первого элемента, который либо

  • равен object, либо
  • делает переданный ему блок оцениваемым вtrue

Array#rindex может позволить вам найти индекс последнего элемента, равный object, но есть ли что-нибудь, что позволяет вам найти индекс последнего элемента, который делаетпереданный ему блок возвращает true?

В противном случае я должен сделать что-то вроде

last_index = array.length - 1 - array.reverse.find_index{|item| item.is_wanted?}

Ответы [ 5 ]

16 голосов
/ 24 августа 2010

В Ruby 1.9.2 Array#rindex принимает блок: http://apidock.com/ruby/Array/rindex

1 голос
/ 24 августа 2010

Или вы можете сделать что-то вроде

last_index = array.map {|i| i.is_wanted? }.rindex(true)

, что немного красивее

1 голос
/ 24 августа 2010

Такой позор доходит до 1.9.2. В то же время, если вы не хотите переворачивать свой массив, а скорее перечислять поиск в обратном порядке, вы можете сделать

last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? } (1,8,7 и выше)

0 голосов
/ 24 августа 2010

Это немного не по теме, но в любое время у вас есть коллекция с размером, и вы хотите получить результат другого размера, который вы можете использовать для инъекции.В большинстве случаев он избегает ненужных циклических операций с входной коллекцией.

Например, если я хочу найти индекс последнего nil:

a = [1,2,nil,6,8,nil,9,nil,10,11,12]
# => [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12] 
a.inject([-1, nil]){|(current_index, matched), value| current_index += 1; matched = current_index if value.nil?; [current_index, matched]}.last
# => 7
0 голосов
/ 24 августа 2010

Вы можете улучшить предельную краткость в своем обходном пути, удалив a.length, так как отрицательные индексы отсчитываются от конца строки в []

irb(main):015:0> a=[1,2,nil,6,8,nil,9,nil,10,11,12]
=> [1, 2, nil, 6, 8, nil, 9, nil, 10, 11, 12]
irb(main):016:0> -(a.reverse.index(nil)+1)
=> -4
irb(main):017:0> a[-4]
=> nil

Все еще кажется ужасно неэффективным инвертировать весь массив, когда все, что вы хотите сделать, это перебрать его обратно, но это ваша эффективность против вызова эстетической оценки

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