我正在迭代一大堆字符串,这些字符串遍历一小组字符串。由于大小,这种方法需要一段时间才能完成,所以为了加快速度,我试图从较小的集合中删除字符串,这些字符串不再需要随之使用。以下是我目前的代码:
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
这对我来说有些邋..有更好的方法吗?
答案 0 :(得分:38)
使用delete_if
array.delete_if do |v|
if v.should_be_deleted?
true
else
v.update
false
end
end
答案 1 :(得分:-1)
使用'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]