总结教训-删除的微妙变化

       今天调试程序,发现一个bug。如一个Vector db存储着已经访问的URL作为URL库(每个URL唯一),另一个Vector newUrl保存新搜索到的URL(假设这个向量中不会有相同的URL),当newUrl达到一定大小,对其进行检测删除已经存在的URL,开始的实现方法是:

for(int i=0; i<newUrl.size(); i++)
{
     if(db.contains(newUrl.get(i))
           newUrl.remove(i);
}

        这样对了吗?我开始就是这么写的,结果大错特错。当在向量中删除一个元素后,索引在其后的元素索引都变了,这样将来再要删除一个元素时,按照i索引所删除的并不是自己想要的(而是索引更靠后的)。
        解决方法有二:从索引号最大的开始往小的查找删除;按内容删除(注意不要删除不在db中,且是第一次被发现的那个)。下面是第一种解决方法:


for(int i=newUrl.size()-1; i--)
{
     if(db.contains(newUrl.get(i))
           newUrl.remove(i);
}

        其实这个bug很微妙,主要是开始编写的时候没有认真考虑,导致后来花了很多时间才找到它。越是简单的东西,还是应该花些心思在上面的,不然受害更深。

你可能感兴趣的:(总结教训-删除的微妙变化)