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());

  最后效果是一样的,怎么方便怎么来。

  

posted @ 2023-03-23 11:30  我命倾尘  阅读(2626)  评论(0编辑  收藏  举报