Java开发:list列表元素遍历删除
一、常见误区
1、提前结束遍历(直接使用列表长度进行遍历)
for(int i = 0;i < list.size();i++){ list.remove(i); }
在list不断地删除元素的同时,总列表list的长度也在不断缩小,i值会提前和列表的总长度相等,导致遍历提前结束,造成前面的元素删掉了,但是结束时的长度后面的元素未能删掉。
2、下标越界(提前固定列表长度进行遍历)
int len = list.size(); for(int i = 0;i < len;i++){ list.remove(i); }
相比于上一种提前结束的,这种方式提前取出了原列表的总长度,避免了遍历删除时长度变化导致提前结束。但依旧无法避免列表的动态变化,列表随着删除元素在不断缩小,后续的长度比原列表小的多,在遍历到超出现有列表的长度时,就会出现下标越界的问题。
二、可用方式
测试数据(遍历删除以下列表中包含“产品”的):
List<String> deptList = Arrays.asList("产品研发部","产品交付部","系统运维部","系统安全部","市场运营部","人事管理部");
注:Arrays.asList生成的列表为定长列表,仅用来展示,不可进行add、remove等操作,需要后续转化为arraylist进行相关操作。
1、反向遍历(正向遍历删除会导致列表长度的缩小,与索引的逐渐增大现象结合后就会出现相应问题,只要反向使长度缩小和索引同步缩小结合就能避免)
List<String> newList = new ArrayList<>(deptList); for(int i = newList.size() - 1; i > -1; i--){ if(newList.get(i).indexOf("产品") != -1){ newList.remove(i); } }
2、迭代器遍历(迭代器类似于链表形式吧,过完一个元素就到下一个,不会像索引和长度两者结合使用一样出现跳过或者越界的情况)
List<String> newList = new ArrayList<>(deptList); for(Iterator<String> iterator = newList.iterator(); iterator.hasNext(); ){ if(iterator.next().indexOf("产品") != -1){ iterator.remove(); } }
三、另辟蹊径
删除操作其实可以用筛选来代替,直接筛选出来有用的部分数据,就相当于遍历删除了无用的数据。
通过列表的流筛选操作进行处理过滤:
List<String> newList = new ArrayList<>(deptList); List<String> resultList = newList.stream().filter(item -> item.indexOf("产品") == -1).collect(Collectors.toList());
最后效果是一样的,怎么方便怎么来。