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ć?
łatwiejszy sposób na robienie czego? Co próbujesz osiągnąć? – wilhelmtell
Czy możesz nie zaakceptować własnej odpowiedzi poniżej? To zdecydowanie nie jest najlepsza – WattsInABox