2010-05-29 17 views
12

I iteracja na bardzo duży zestaw ciągów, które iteruje na mniejszy zestaw ciągów. Ze względu na rozmiar, ta metoda zajmuje trochę czasu, więc aby przyspieszyć, próbuję usunąć ciągi z mniejszego zestawu, który nie musi już być używany, ponieważ idzie dalej. Poniżej jest mój bieżący kod:Usuwanie podczas iteracji w Ruby?

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 

Problemem jest to, że mam twarz w prosty sposób, array.delete(string), skutecznie dodaje instrukcji break do pętli wewnętrznej, która zaśmieca wyniki. Jedyny sposób, w jaki mogę to naprawić, to:

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 

To wydaje mi się nie na miejscu. Czy jest lepszy sposób to zrobić?

+0

łatwiejszy sposób na robienie czego? Co próbujesz osiągnąć? – wilhelmtell

+0

Czy możesz nie zaakceptować własnej odpowiedzi poniżej? To zdecydowanie nie jest najlepsza – WattsInABox

Odpowiedz

36

zastosowanie delete_if

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

Śmieszne, jeśli :). 'tablica.delete_if {| v | v.should_be_deleted? } ' – Yossi

+2

Jeśli byłby sensowny, gdyby chciał uruchomić' v.update' w jakikolwiek elegancki sposób :) – trisweb

+0

FYI, usuwanie jest natychmiastowe, więc jeśli blok wzniesie się, zmiany nadal będą odbijane –

-1

stosowanie 'arr.shift'

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

wyjściowa:

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

+0

to wygrał „T '' pracują ' a = [1,2,3,4] a.each do umieszcza a.shift koniec => [3, 4] '' –

+0

@Ivan dzięki za wskazanie tego. Ostatnim razem nie testowałem z każdym zadaniem dla tablicy, ale byłem pewny, że zmiana wykona wymaganą pracę. Więc zredagowałem to teraz. Sprawdź to! – apandey846

+0

również, 'Array # shift' jest nieefektywne, spowoduje O (n²) środowisko wykonawcze. –

Powiązane problemy