Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Удаление во время итерации в Ruby?

Автор вопроса: Jesse JashinskyОтветов: 2

Я перебираю очень большой набор строк, который перебирает меньший набор строк. Из-за размера этот метод требует времени, поэтому, чтобы ускорить его, я пытаюсь удалить строки из меньшего набора, который больше не нужно использовать, по ходу дела. Ниже мой текущий код:

    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

Мне это кажется каким-то небрежным. Есть лучший способ сделать это?

  • проще сделать что? чего вы пытаетесь достичь? wilhelmtell 29.05.2010
  • не могли бы вы не принимать свой собственный ответ ниже? это явно не лучший вариант WattsInABox 14.03.2015

rubyloops

Ответы

Ответ 1 · рейтинг 38 · horseyguy

используйте 1_

array.delete_if do |v|
    if v.should_be_deleted?
        true
    else
        v.update
        false
    end
end

Ответ 2 · рейтинг -1 · Abhishek

используйте 'arr.shift'

a=[1,2,3,4]
while(a.length!=0)
  print a
  a.shift
  print "\n"
end

Выход:

[1, 2, 3, 4]
[2, 3, 4]
[3, 4]
[4]

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы