一次性删除List里的所有元素?不仅听起来简单(只是有个在删除元素时元素下标动态变化的问题在里面,有点苦恼),而且做起来其实也简单(大话了,只是到了后面解决了后才觉得简单的),得益于一同行问的“js中删除元素时下标从1变为0”的问题。
出现问题的代码是这样的(他的是javascript代码,我用java的List模拟):
- List list = new ArrayList();
- list.add("1");
- list.add("2");
- list.add("3");
- list.add("4");
- list.add("5");
- list.add("6");
- for (int i = 0; i < list.size(); i++) {
- System.out.print(list.get(i)+" ");
- }
- System.out.println(""); //多的输出语句只是为了方便看运行结果。
- System.out.println("------------------");
- for (int i = 0; i < list.size(); i++) {
- list.remove(i);
- }
- for (int i = 0; i < list.size(); i++) {
- System.out.print(list.get(i)+" ");
- }
他原本想把所有的元素都给删除的,结果最后打印出来的结果是这样的,有些没有被删除掉:
- 123456
- --------
- 246
看看,这结果很明显出问题了,对吧?本来想把所有的元素都给删除,结果竟然行事不果断,“斩草没有除掉根”,悲剧了,还剩下3个( 我竟然会想到斩草除根这个词,暗暗佩服自己。
)。他一开始就思考到了问题的最根本原因,就是第二次删除的时候,原本下标为1的元素的下标就由1变为0了,原本下标为2的元素下标由2变为了1,由此而做了替死鬼,真是冤枉啊,真是的。所以,2未被删除,3就被删除了(更何况本身List的长度也在变化,长度影响遍历删除的次数,这里不赘述)。一直到for循环最后也依然阻止不了这场悲剧的发生(
该是幸运吧,总算有元素活下来了,但对于我们编代码的就要受罪了),以此类推。
我的解决方法是这样的:
考虑到元素下标每次都要减1变为0(其实,我错了,是元素下标隔1降1),何不如用两个变量来控制循环?我就给了两个变量i和j。i来控制循环次数,j来去除下标动态变化的条件,len解决list长度变化的问题。
代码如下:
- for (int i = 0,j = 0,len = list.size(); i < len; i++) {
- list.remove(j);
- }
- 还有另一个“狗血”版本:
- for (int i = 0,j = 0; i < list.size(); ) {
- list.remove(j);
- }
代码运行的结果是:
- 123456
- --------
结果倒是正常输出了,可两个结果,怎么看怎么不好。
但最终他自己想到了最优化的代码。他优化后的代码如下:
- for (int i = 0; i < list.size(); i++) {
- list.remove(i--);
- }
从这件小事可以看出,分享起作用了,他把这个问题分享给了我,我把我的想法分享给了他,而我们由共同由此解决了问题,找到了可行的答案。所以说,分享是一种好习惯。而且,我始终坚信,会分享、会帮助别人的人他注定会海纳百川,也会有更多的人会体会到分享的快乐。