2010-05-29 35 views
12

Ben dizeleri çok büyük bir set, dizeleri küçük bir set üzerinde dolaşır yineleme ediyorum. Boyutu nedeniyle, bu yöntem o birlikte gider olarak artık kullanılması gerekirse daha küçük kümesinden dizeleri silmeye çalışıyorum, bunu hızlandırmak için öylesine yapmak biraz zaman alıyor. Aşağıda benim geçerli kod:yineleme iken Ruby silme?

Ms::Fasta.foreach(@database) do |entry| 
     all.each do |set| 
      if entry.header[1..40].include? set[1] + "|" 
       startVal = entry.sequence.scan_i(set[0])[0] 

       if startVal != nil 
        @locations << [set[0], set[1], startVal, startVal + set[1].length] 
        all.delete(set) 
       end 
      end 
     end 
    end 

Ben karşılaştığımız sorun kolay yolu, array.delete(string) etkili sonuçlar haberci yukarıya iç döngü, bir break ifadesini ekler olmasıdır. Bunu düzeltmek için bildiğim tek yol bu yapmaktır:

Ms::Fasta.foreach(@database) do |entry| 
     i = 0 

     while i < all.length 
      set = all[i] 

      if entry.header[1..40].include? set[1] + "|" 
       startVal = entry.sequence.scan_i(set[0])[0] 

       if startVal != nil 
        @locations << [set[0], set[1], startVal, startVal + set[1].length] 
        all.delete_at(i) 
        i -= 1 
       end 
      end 

      i += 1 
     end 
    end 

Bu tür özensiz bana hissediyor. Bunu yapmanın daha iyi bir yolu var mı?

+0

kolay bir yolu? ne elde etmeye çalışıyorsun? – wilhelmtell

+0

Lütfen aşağıda kendi cevabınızı kabul edemez misiniz? Açıkçası en iyisi – WattsInABox

cevap

36

kullanımı delete_if

array.delete_if do |v| 
    if v.should_be_deleted? 
     true 
    else 
     v.update 
     false 
    end 
end 
+4

Komik değilse :). 'array.delete_if {| v | v.should_be_deleted? } ' – Yossi

+2

Eğer mükemmel bir anlamda eğer 'v.update' herhangi bir zarif şekilde çalıştırmak istediyse :) – trisweb

+0

FYI, silme anındadır, yani blok yükselirse, değişiklikler yine de yansıyacaktır –

-1

kullanımı 'arr.shift'

a=[1,2,3,4] 
while(a.length!=0) 
    print a 
    a.shift 
    print "\n" 
end 

Çıkış:

[1, 2, 3, 4]
[2, 3, 4]
[3, 4]
[4]

ne yapacağını
+0

bu kazandı 't çalışma ' a = [1,2,3,4] a.each yapmak koyar uç a.shift => [3, 4] ' –

+0

@Ivan Bunu işaret ettiğin için teşekkürler. Son kez her dizi ile test etmedim ama vardiya gerekli işi yapacağından emin oldum. Şimdi düzenledim. Kontrol et! – apandey846

+0

da, "Array # shift" etkin değil, O (n²) çalışma zamanına neden olur. –