遍历list集合删除指定元素方法

今天的在项目中犯的一个错误记录一下:

刚开始粗心写成for喜欢遍历 这样会出现下表越界的问题

应该是iterate遍历移除集合中的元素

以下是转载:

一种错误的方式:

for(int i = 0 , len= list.size();i<len;++i){  
  if(list.get(i)==XXX){  
       list.remove(i);  
  }  
}

上面这种方式会抛出如下异常:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3  
    at java.util.ArrayList.RangeCheck(Unknown Source)  
    at java.util.ArrayList.get(Unknown Source)  
    at ListDemo.main(ListDemo.java:20)

因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常

可以对上面的程序进行如下改进:

for(int i = 0 , len= list.size();i<len;++i){  
  if(list.get(i)==XXX){  
       list.remove(i);  
       --len;//减少一个  
       --i;  
 }  
}

上面的代码就正确了。

下面我们再介绍一种方案:

List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。

Iterator<String> sListIterator = list.iterator();  
while(sListIterator.hasNext()){  
    String e = sListIterator.next();  
    if(e.equals("3")){  
    sListIterator.remove();  
    }  
}

上面这种也是正确的,并推荐使用第二种方案。

两种方案实现原理都差多的,第二种只是jdk封装了下。

查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案

时间: 2024-12-17 20:35:39

遍历list集合删除指定元素方法的相关文章

java集合遍历删除指定元素异常分析总结

在使用集合的过程中,我们经常会有遍历集合元素,删除指定的元素的需求,而对于这种需求我们往往使用会犯些小错误,导致程序抛异常或者与预期结果不对,本人很早之前就遇到过这个坑,当时没注意总结,结果前段时间又遇到了这个问题,因此,总结下遍历集合的同时如何删除集合中指定的元素: 1.错误场景复原 public class ListRemoveTest { public static void main(String[] args) { List<User> users = new ArrayList&l

C#遍历List并删除某个元素的方法

C#遍历List并删除某个元素的方法,你的第一反应使用什么方法实现呢?foreach? for? 如果是foreach,那么恭喜你,你答错了.如果你想到的是用for,那么你只是离成功进了一步. 正确的做法是用for倒序遍历,根据条件删除.下面我们用代码来演示foreach,for删除list数据的情况: class Program { public class Students { public string Name { get; set; } public int Age { get; se

jquery数组删除指定元素的方法:grep()

jquery数组删除指定元素的方法:grep() 金刚 数组 jquery javascript 元素 遇到的问题 今天遇到一个问题,删除数组中的一个指定元素,并返回新的数组. 我定义的js数组是这样的: var sexList=new Array[3]; sexList[0]="1"; sexList[1]="2"; sexList[2]=""; 想达到的效果 我想达到的效果是这样的: 删除索引=1的元素,并返回新数组. 返回的结果是: var

动态的添加或者删除指定元素代码实例

动态的添加或者删除指定元素代码实例:本章节介绍一段代码实例,能够动态的添加或者删除指定的元素,这里不管实际应用中此代码出现的概率有多大,只在于如何实现类似的功能,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /&

【Lua】table表删除指定元素 (转)

在对表做删除操作时,发现table.remove(table,idx)这个方法是根据table中的索引进行删除操作,而现在的需求是根据value值进行删除操作,在quick-x中也有相应的table方法封装: 1.根据table中的value值进行删除操作 -- table中删除指定元素(非根据索引) -- @param array 要操作的容器 -- @param value 删除value值 -- @param removeadll 是否删除所有相同的值 -- @return 返回删除值的个

ES6数组中删除指定元素

知识点: ES6从数组中删除指定元素 findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引.否则返回-1. arr.splice(arr.findIndex(item => item.id === data.id), 1) http://louiszhai.github.io/2017/04/28/array/ 1:js中的splice方法 splice(index,len,[item]) 注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组

Java遍历List并删除某些元素

Java遍历List并删除某些元素 ? 在阿里的Java编程规约中有一条:[强制]不要在foreach循环里进行元素的remove/add操作.remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁. ? 这里不禁要问为什么? ? 首先来试一下,遍历List时删除元素究竟行不行: public class IteratorTest { public static void singleThreadRemove1(){ List<String> list = n

遍历Map集合的几种方法

遍历Map集合的几种方法 方法1:使用迭代器iterator遍历集合 HashMap<Integer, Long> map = new HashMap<Integer, Long>(); for (int i = 1; i <= 50; i++) { map.put(i, Math.round(3.14*i*i)); } // map转换为set集合 Set<Entry<Integer, Long>> set = map.entrySet(); //

关于链表:删除指定元素、在指定位置后插入或删除元素

说明:思路中写的是伪代码,为了表达意思. 一,删除链表中与val相等的结点 需要两个结点 cur和prev(作为cur的前驱结点)遍历整个链表,与给定的val作比较,如果相等:prev.next=cur.next;如果不相等:cur=cur.next; 二.在指定POS后插入.删除结点插入:pos.next=node;node.next=pos.next;删除:pos.next=pos.next.next 代码如下: ```class Node {int val;Node next = null