配列から複数の要素を削除しようとしてはまった
ある配列から、複数の要素を同時に削除しようとしてはまった。
a = ["apple","banana","lemon","orange"]
があったときに、 an を含む要素だけを取り除きたいとする
(bananaとorangeを取り除きたい)
a.each do |youso| if(youso =~ /an/) a.delete(youso) end end puts a #=>[apple,lemon]
これだけでいいはずだった。
が、twitterのタイムラインを取得し、@を含むtweetだけ削除しようとしたらなぜか取りこぼしが発生した。
ループ中に削除すると配列がずれるから…?
などと考え、削除したい番号を記録し、逆順に消すというスーパー回りくどいことをした。
#"@"が含まれているtweetを除く delat = [] timeline.each_with_index do |line,i| if(line =~ /\@/) puts "@を含むtweetを削除->\n\t",line delat.push(i) end end delat.reverse.each do |i| timeline.delete_at(i) end
スマートな方法がわからない…
とりあえずこれで動いています。
取りこぼしも一個か二個で、毎回同じtweetだったのですが、よくわかりませんでしたorz