List.remove在for循环中出现问题的解决方案

转自:https://blog.csdn.net/jam_yin/article/details/82382044

试了下第二种和第三种方法都可以,第三种记得是 it.remove(); 不带参数

在java中对list进行操作很频繁,特别是进行list启遍历,这些操作我们都会,也很熟悉,但是对java中list进行删除元素,remove list中的元素就不怎么熟悉了吧,可以说很陌生,是实际操作中也很容易出错,先看看下面这个java中如何remove list 中的元素吧.

  1.  
  2. public class test {
  3. public static void main(String[] args) {
  4. String str1 = new String("abcde");
  5. String str2 = new String("abcde");
  6. String str3 = new String("abcde");
  7. String str4 = new String("abcde");
  8. String str5 = new String("abcde");
  9. List list = new ArrayList();
  10.  
  11. list.add(str1);
  12. list.add(str2);
  13. list.add(str3);
  14. list.add(str4);
  15. list.add(str5);
  16.  
  17. System.out.println("list.size()=" + list.size());
  18. for (int i = 0; i < list.size(); i++) {
  19. if (((String) list.get(i)).startsWith("abcde")) {
  20. list.remove(i);
  21. }
  22. }
  23. System.out.println("after remove:list.size()=" + list.size());
  24. }
  25. }

大家觉得这个程序打印出来的结果是多少呢?

Java代码

  1. 运行结果不是:
  2.  
  3. list.size()=5
  4.  
  5. after remove:list.size()=0

而是:

Java代码

  1. list.size()=5
  2.  
  3. after remove:list.size()=2

这是怎么回事呢?到底要如何remove list 中的元素呢?
 

原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取。

 

 

怎么解决?有三种方法可以解决这个问题:

1.倒过来遍历list

Java代码

  1. for (int i = list.size()-1; i > =0; i--) {
  2.   if (((String) list.get(i)).startsWith("abcde")) {
  3.    list.remove(i);
  4.   }
  5. }

2.每移除一个元素以后再把i移回来

Java代码

  1. for (int i = 0; i < list.size(); i++) {
  2.   if (((String) list.get(i)).startsWith("abcde")) {
  3.    list.remove(i);
  4.    i=i-1;
  5.   }
  6. }

3.使用iterator.remove()方法删除

Java代码

if (null != list && list.size() > 0) {
    Iterator it = list.iterator();  
    while(it.hasNext()){
        Student stu = (Student)it.next(); 
        if (stu.getStudentId() == studentId) {
            it.remove(); //移除该对象
        }
    }
}

转载于:https://www.cnblogs.com/wzb0228/p/11313931.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值