Я выполняю итерацию по очень большому набору строк, который выполняет итерацию по меньшему набору строк. Из-за размера этот метод занимает некоторое время, поэтому, чтобы ускорить его, я пытаюсь удалить строки из меньшего набора, которые больше не нужно использовать по мере продвижения. Ниже мой текущий код:
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)
эффективно добавляет оператор break во внутренний цикл, который испортит результаты. Единственный способ, которым я знаю, как это исправить, - сделать это:
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
Это кажется мне небрежным. Есть ли лучший способ сделать это?