2010-08-24 11 views
13

Array#find_index pozwala znaleźć indeks pierwszego elementu, który alboCzy istnieje odpowiednik Array # find_index dla ostatniego indeksu w ruby?

  • jest równa object lub
  • sprawia blok przeszedł do niej ocenia się prawdziwym

Array#rindex może zezwolić znaleźć indeks ostatniego elementu, który jest równy object, ale czy istnieje coś, co pozwala na znalezienie indeksu ostatniego elementu, który sprawia, że ​​blok mu przekazany zwraca true?

W przeciwnym razie należy zrobić coś

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

Odpowiedz

2

taki wstyd chodzi aż 1.9.2. W międzyczasie, jeśli nie chcesz, aby odwrócić swoją tablicę, ale raczej wyliczać wyszukiwanie w odwrotnej kolejności, można zrobić

last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? } (1.8.7 i nowsze)

0

można zrobić niewielką poprawę w zwięzłość Twój obejście poprzez usunięcie a.length, jak liczyć negatywne indeksów od końca łańcucha w []

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 

nadal wydaje się potwornie nieefektywne odwrócić cały szereg kiedy wszystko, co chcesz zrobić, to iteracji wstecznej przez niego, ale to jest twoja skuteczność w stosunku do estetyki wyroku zadzwoń

+0

To powiedziawszy, wolę chubas odpowiedź. Nie zauważyłem tam rindexu ... – telent

+0

+1 bardzo sprytny .. – Anurag

+0

Ktokolwiek to był, który zniósł tę odpowiedź, jaki jest dokładnie twój sprzeciw? – telent

1

Albo można zrobić coś

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

która jest nieco ładniejsza

0

Jest to nieco off topic, ale w każdej chwili masz kolekcję o wielkości i chcesz wyniku innego rozmiaru możesz użyj wstrzyknięcia. W większości przypadków unika niepotrzebnych operacji w pętli w zbiorze wejściowym.

Na przykład, jeśli chcesz znaleźć indeks ostatniego zera:

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 
Powiązane problemy