2010-08-24 5 views
13

Array#find_index können Sie den Index des ersten Elements finden, die entwederGibt es ein Äquivalent von Array # find_index für den letzten Index in Ruby?

  • zu einem object gleich oder
  • macht ein Block an sie übergeben zu wahren

Array#rindex auswerten können Sie erlauben um den Index des letzten Elements zu finden, das gleich object ist, aber gibt es irgendetwas, das es Ihnen erlaubt, den Index des letzten Elements zu finden, das einen an ihn übergebenen Block als wahr zurückgibt?

Andernfalls sollte ich etwas tun, wie

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

Antwort

2

so schade es bis 1.9.2 kommt. In der Zwischenzeit, wenn Sie Ihre Array umkehren nicht wollen, sondern die Suche in umgekehrter Reihenfolge aufzuzählen, können Sie

last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? } (1.8.7 und höher) tun

0

Sie eine marginale Verbesserung Prägnanz machen könnte Ihre Abhilfe durch a.length entfernen, da negative Indizes zählen vom Ende der Zeichenfolge in []

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 

es ist immer noch schrecklich ineffizient scheint das gesamte Array umzukehren, wenn alles, was Sie tun wollen durch sie ist iterieren rückwärts, aber das ist Ihre Effizienz vs Ästhetik Beurteilung rufen

+0

Das heißt, ziehe ich chubas Antwort. Ich habe nicht bemerkt, Rindex da ... – telent

+0

+1 sehr clever .. – Anurag

+0

wer auch immer es war, wer diese Antwort downvoted, was genau ist Ihr Einwand? – telent

1

Oder man könnte so etwas wie

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

tun, die etwas schönere

ist
0

Dies ist etwas off topic, aber zu jeder Zeit haben Sie eine Sammlung mit einer Größe und Sie wollen ein Ergebnis einer anderen Größe können Sie Verwenden Sie injizieren. In den meisten Fällen werden unnötige Schleifenoperationen bei der Eingabesammlung vermieden.

Zum Beispiel, wenn ich den Index des letzten nil finden wollen:

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 
Verwandte Themen