Я выполняю итерации по очень большому набору строк, который выполняет итерации по меньшему набору строк. Из-за размера, этот метод требует времени, чтобы сделать, так для ускорения его, я пытаюсь удалить строки из меньшего набора, который больше не должен использоваться, как он продвигается. Ниже мой текущий код:
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
Проблема, с которой я сталкиваюсь, состоит в том что простой способ, array.delete(string)
, эффективно добавляет оператор завершения к внутреннему циклу, который портит результаты. Единственным путем я знаю, как зафиксировать, это должно сделать это:
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
Это чувствует себя довольно неаккуратным мне. Существует ли лучший способ сделать это?
используйте delete_if
array.delete_if do |v|
if v.should_be_deleted?
true
else
v.update
false
end
end