for语句在程序开发中经常被用到,它语法简单、逻辑严谨,完全可以替代其他任何循环语法,所以说它的可应用范围最广泛。但在应用for语句时也要注意,该语句内部的局部自增或自减变量i若处理不当,可能给程序带来巨大隐患,比如在使用for语句删除集合中的元素时,就可能出现下面的情况。
例3.1 使用for删除集合元素时的陷阱。(光盘位置:光盘\MR\Instance\3\01\UseForApp)
本实例的目的是使用for语句删除集合中的所有元素,上述代码中描述了使用remove()方法按照元素的位置索引逐个删除元素,看起来似乎很完美,但运行结果却出人意料,程序运行结果如图3.1 所示。
图3.1 使用for删除集合元素陷阱
说 明
从执行结果中,可以得出这样的判定结论,集合中的元素B在for循环中并未得到执行remove()方法。由于B元素的索引值为 1,这足以说明在使用for语句删除集合元素的过程中发生了跳跃,并没有按照元素在集合中的原始顺序逐个地删除。
进一步分析发现,每当删除一个元素时,集合的size()方法的值都会减小 1,这将直接导致集合中元素的索引重新排序,进一步说,就是剩余所有元素的索引值都减小 1,正如图3.2 所示的那样,而for语句的局部变量i仍然在递增,这必将导致删除操作发生跳跃,这就是问题的根源所在。
图3.2 集合元素删除示意图
提 示
清除集合中元素的方法很多,本实例并不是仅仅为了说明如何删除集合的所有元素,而是通过对这种现象的分析,让读者体会在使用循环语句处理集合问题时应该注意什么。
从上面的分析可知,删除集合中的元素会导致剩余元素的索引重排序,但在完全删除元素之前,索引值为0的元素一直存在,这就是解决问题的一个着手点。解决问题的办法可这样考虑,在remove()方法被执行后,就使局部变量i的值减少 1,从而始终保持i的值为 0,这样每次循环都删除索引值为0的元素,最终实现删除集合中的所有元素。改正后的主要代码如下:
技 巧
要删除List集合中的所有元素,还可使用该泛型集合的clear()方法,该方法用于移除当前集合中的所有元素。