在Ruby中迭代时删除?

Jes*_*sky 14 ruby loops

我正在迭代一大堆字符串,它们迭代一小组字符串.由于大小,这种方法需要一段时间才能完成,所以为了加快速度,我试图从较小的集合中删除字符串,这些字符串不再需要随之使用.以下是我目前的代码:

    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
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,简单的方法是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
Run Code Online (Sandbox Code Playgroud)

这对我来说有些邋.. 有一个更好的方法吗?

hor*_*guy 38

使用 delete_if

array.delete_if do |v|
    if v.should_be_deleted?
        true
    else
        v.update
        false
    end
end
Run Code Online (Sandbox Code Playgroud)

  • 有趣,如果:).`array.delete_if {| v | v.should_be_deleted?}` (4认同)
  • 如果他想以任何优雅的方式运行`v.update`,那将是完美的意义:) (2认同)