List使用remove(index);遇到的问题;

来源:互联网 发布:37传奇霸业龙脉数据 编辑:程序博客网 时间:2024/05/14 12:00

作者:燕歆波

导读:remove(index)是list根据下标来删除元素,可是当我们在for循环中遍历list删除某些元素的时候,却出现了有些元素无法删除的问题;

原因:
终于有一个问题我没有百度了(人家告诉我的),正常的遍历情况是这样子的

        for (int i = 0; i < list.size(); i++) {            if(list.get(i).startsWith("abcde")){                System.out.println("删除的下标"+i);                list.remove(i);            }        }        for (String s : list) {            System.out.println(s+"删除后");        }

其实如果现在的数据是这样子的:

 List<String> list= new ArrayList<>();        list.clear();        list.add("abcde1111");        list.add("abcde2222");        list.add("abcde3333");        list.add("abcde4444");

打印出来的结果是这样子的:

删除的下标0删除的下标1abcde2222删除后abcde4444删除后

遍历后只删除了第一和第三个元素,可是删除的下标却是正常的0和1;

再删除第一个元素后,我们跳出不在循环,打印数据:

abcde2222删除后abcde3333删除后abcde4444删除后

其实现在下标0的数据应该是”abcde2222”,但是此时遍历中的i值已经加1,变成了1,那么第二次遍历时0的位置其实就已经被忽略了,删除的应该是”abcde3333删除后”这个元素,因为现在”abcde3333删除后”这个元素的位置才是1,然后再次遍历,i已经成了2,因为i从零开始,所以2代表的其实是第三个位置,可是list的长度现在只有2了,上次遍历之前的第三个位置应该是”abcde4444删除后”这个元素,可是现在”abcde4444删除后”这个元素的位置赫然已经变成了1,所以剩下的两个元素永远无法删除。

解决方法:
1.倒叙遍历,从后往前遍历,可以避免下标前移的问题
2.正常遍历,删除后将i的位置(下标的位置)前移,这样删除的永远是第0个位置。

for (int i = 0; i < list.size(); i++) {   if(list.get(i).startsWith("abcde")){       System.out.println("删除的下标"+i);       list.remove(i);       i = i-1;//这里手动将下标前移   }}

网上说还可以使用Iterator遍历删除,我没试过,这里就给出两种方法,如果想要了解请参考(http://www.cnblogs.com/doudouxiaoye/p/5669481.html)

原创粉丝点击