2010-08-24 26 views

cevap

14

gibi bir şey bloğunu kabul eder yapmalıdır. Eğer dizi ters değil, tersine arama numaralandırmak istemiyorsanız arada, sen Sen bir marjinal kısalık gelişme yapabilir

2

Böyle bir utanç:

Aksi takdirde, Ruby 1.9.2 Array#rindex yılında

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

last_index = array.length - 1 - array.rindex.find_index{|item| item.is_wanted? } (yukarı 1.8.7 ve üzeri) yapabilir a.length kaldırarak geçici çözüm, negatif endeksler, hala yapmak istediğiniz tüm içinden geriye doğru yineleme olduğunda tüm dizi ters hideously verimsiz görünmektedir

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 

[] içinde dizenin sonundaki saymak ama bu sizin verimlilik vs estetik yargılama çağrı

+0

, ben chubas cevabı tercih. Orada rindex farketmedi ... – telent

+0

+1 çok zeki .. – Anurag

+0

Bu cevabı kimin düşürdüğü, itirazınız tam olarak nedir? – telent

1

Yoksa biraz daha güzel olduğunu

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

gibi bir şey

0

Bu biraz konu dışı olmakla her zaman bir boyuta sahip bir koleksiyona sahip ve mümkün başka boyutta bir sonuç istenmiyorsa yapabilirdi enjekte kullanın. Çoğu zaman, girdi toplamada gereksiz döngü işlemlerini önler. Örneğin

Geçen nil dizinini bulmak istiyorsanız: bahsedilen

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 
İlgili konular