title: Deleting While Iterating in Ruby?
body: <p>I'm iterating over a very large set of strings, which iterates over a smaller set of strings. Due to the size, this method takes a while to do, so to speed it up, I'm trying to delete the strings from the smaller set that no longer needs to be used as it goes along. Below is my current code:</p>
  
  <pre><code>    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 &lt;&lt; [set[0], set[1], startVal, startVal + set[1].length]
                      all.delete(set)
                  end
              end
          end
      end
  </code></pre>
  
  <p>The problem I face is that the easy way, <code>array.delete(string)</code>, effectively adds a break statement to the inner loop, which messes up the results. The only way I know how to fix this is to do this:</p>
  
  <pre><code>Ms::Fasta.foreach(@database) do |entry|
          i = 0
  
          while i &lt; 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 &lt;&lt; [set[0], set[1], startVal, startVal + set[1].length]
                      all.delete_at(i)
                      i -= 1
                  end
              end
  
              i += 1
          end
      end
  </code></pre>
  
  <p>This feels kind of sloppy to me. Is there a better way to do this?</p>