写一段代码在遍历ArrayList时移除一个元素(假设条件remove为true时移除)

1. Java中Iterator用法整理
概念: 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。

Java中的Iterator功能比较简单,并且只能单向移动:

(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。

(2) 使用next()获得序列中的下一个元素。

(3) 使用hasNext()检查序列中是否还有元素。

(4) 使用remove()将迭代器新返回的元素删除。

Iterator是Java迭代器最简单的实现,为List设计的ListIterator具有更多的功能,它可以从两个方向遍历List,也可以从List中插入和删除元素。
  
语法:

  • hasNext: 如果仍有元素可以迭代 则返回true 是Boolean类型
  • next: 返回迭代的下一个元素
  • remove(): 从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)

代码:

package cn.xiaobing.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class IteratorDemo {
    public static void main(String[] args) {
        List<String> lst = new ArrayList<String>();
        lst.add("aaa");
        lst.add("bbb");
        lst.add("ccc");
        lst.add("ddd");
        lst.add("eee");
        lst.add("fff");
        Iterator<String> iterator = lst.iterator();
        //iterator.hasNext()如果存在元素的话返回true
        while(iterator.hasNext()) {
            //iterator.next()返回迭代的下一个元素
            System.out.println(iterator.next());
        }
    }

}

回归本题
一个ArrayList对象aList中存有若干个字符串元素,现欲遍历该ArrayList对象,删除其中所有值为"abc"的字符串元素,请用代码实现。

public class Test1 {  
      
        public static void main(String[] args) {  
            ArrayList<String> aList = new ArrayList<String>();  
            aList.add("a");  
            aList.add("ab");  
            aList.add("abc");  
            aList.add("abcr");  
            aList.add("abc");  
            aList.add("abcf");  
            aList.add("abc");  
            aList.add("abdc");  
              
            for(int i = 0;i < aList.size();i++){  
                if(aList.get(i).equals("abc")){  
                    aList.remove(i);  
                      
                  
                }  
            }  
              
            System.out.println(aList);  
        }  
      
    }  

输出结果为:[a, ab, abcr, abcf, abdc].
也可以使用迭代器来遍历:

Iterator<String> iter = aList.iterator();  
            while(iter.hasNext()){  
                if(iter.next().equals("abc")){  
                    iter.remove();  

                } 

结果与上面相同

修改数据增加一个"abc"

 ArrayList<String> aList = new ArrayList<String>();  
            aList.add("a");  
            aList.add("ab");  
            aList.add("abc");  
            aList.add("abc");  //多加的一行  
            aList.add("abcr");  
            aList.add("abc");  
            aList.add("abcf");  
            aList.add("abc");  
            aList.add("abdc");  

用之前的for循环就会漏掉一个"abc" 而迭代器不会

原因:
检查后发现。在for循环里,当清除掉前一个“abc”后,索引会指向下一个“abc”,然而还做了i++操作,等于直接将这个“abc”跳了过去去执行后面的步骤,从而使它“逃过法网”。
而迭代器不会有这样的问题是因为hasNext()方法,原理是指针向后移动,每运行一次it.next(),指针向后移动一次,一个一个的遍历

总结:
使用两种遍历元素发现还是使用迭代器更好用

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值