Удаление при итерации в 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

Проблема, с которой я сталкиваюсь, состоит в том что простой способ, 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

Это чувствует себя довольно неаккуратным мне. Существует ли лучший способ сделать это?

14
задан Sam 26 October 2014 в 22:16
поделиться