Estoy iterando sobre un conjunto muy grande de cadenas, que itera sobre un conjunto más pequeño de cadenas. Debido al tamaño, este método tarda un tiempo en hacerlo, por lo que para acelerarlo, estoy tratando de eliminar las cadenas del conjunto más pequeño que ya no es necesario usar a medida que avanza. A continuación se muestra el código actual:¿Eliminar durante la iteración en 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
El problema que enfrentamos es que el camino más fácil, array.delete(string)
, agrega efectivamente una sentencia break para el bucle interior, lo que puede confundir los resultados. La única manera que sé cómo solucionar este problema es hacer esto:
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
Esto se siente tipo de descuidado a mí. ¿Hay una mejor manera de hacer esto?
manera más fácil de hacer qué? ¿Qué estás intentando lograr? – wilhelmtell
¿puede por favor no aceptar su propia respuesta a continuación? Claramente, no es el mejor – WattsInABox