Löschen Während der Iteration in Ruby?
Ich bin der Iteration über eine sehr große Menge von strings, die wiederholt über einen kleineren Satz von Zeichenketten. Aufgrund der Größe, diese Methode dauert eine Weile zu tun, so dass es zu beschleunigen, ich bin versucht, löschen Sie die Zeichenfolgen aus die kleinere Gruppe, die nicht mehr verwendet werden muss, wie es entlang geht. Unten ist mein Aktueller code:
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
Das problem, das ich konfrontiert ist, dass der einfache Weg, array.delete(string)
effektiv fügt eine break-Anweisung, um die innere Schleife, die vermasselt die Ergebnisse. Der einzige Weg, ich weiß, wie dieses Problem zu beheben ist, dies zu tun:
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
Fühlt sich irgendwie schlampig zu mir. Gibt es einen besseren Weg, dies zu tun?
bitte können Sie nicht akzeptieren, Ihre eigene Antwort unten? Es ist eindeutig nicht die beste
InformationsquelleAutor Jesse Jashinsky | 2010-05-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
verwenden
delete_if
Der wenn-Sinn, wenn er laufen wollte
v.update
im eleganten Art und Weise 🙂FYI, löschen sofort, so dass, wenn block wirft, werden die änderungen noch reflektiert werden
Ruby ist so viel Spaß
InformationsquelleAutor horseyguy
verwenden 'arr.shift'
Ausgabe:
[1, 2, 3, 4]
[2, 3, 4]
[3, 4]
[4]
vielen Dank für diesen Hinweis. Letztes mal habe ich nicht getestet mit der jeweils für das array, aber war sich sicher, dass der Umschalttaste wird die benötigten job. So bearbeitet es jetzt. Überprüfen Sie es!
auch
Array#shift
ist ineffizient, verursacht O(n2) - Laufzeit.InformationsquelleAutor apandey846