zoukankan      html  css  js  c++  java
  • 迭代时删除指定元素

    迭代集合时,删除集合元素会发生运行时异常

    但两种情况除外

    1.ArrayList,Vector,LinkedList等list集合,当使用Iterator遍历时,如果正在遍历倒数第2个元素,用List集合的

    remove()方法不会引发异常。

    package example;
    
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    
    
    
    public class Test  {
    
        public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<String>();
        list.add("111");
        list.add("222");
        list.add("333");
        Iterator<String> it=list.iterator();
        while(it.hasNext()){
            String ele=it.next();
            //当迭代到第二个元素时
            if(ele.equals("222")){
                //直接删除集合中倒数第二个元素
                list.remove(ele);
                }
            }
        System.out.println(list);//打印[111, 333]
    
        }
    
    
    }

    2 对于Set集合有类似现象,删除最后一个元素不会发生异常

    package example;
    
    import java.util.HashSet;
    import java.util.Iterator;
    import java.util.Set;
    import java.util.TreeSet;
    
    
    
    public class Test  {
    
        public static void main(String[] args) {
        TreeSet<String> list=new TreeSet<String>();
        list.add("111");
        list.add("222");
        list.add("333");
        Iterator<String> it=list.iterator();
        while(it.hasNext()){
            String ele=it.next();
            
            if(ele.equals("333")){
                //直接删除集合中倒数第一个元素
                list.remove(ele);
                }
            }
        System.out.println(list);//打印[111, 222]
    
        }
    
    
    }

    原因:

    1    List集合对应的Itreator实现类(Itr)的hasNext()方法

     public boolean hasNext() {
                return nextIndex < size;
            }

    当遍历到倒数第二个元素时,下一步即将访问的元素索引为size()-1。当List删除集合的任意元素后,size()变为size()-1,导致hasNext()返回false,

    遍历提前结束。

    2对于Set集合类似,如果当前正在遍历最后一个元素,也就是集合遍历已经完成,此时删除不会异常。

    package example;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class Test {
    
        public static void main(String[] args) {
            List<String> list = new ArrayList<String>();
            list.add("1");
            list.add("2");
            list.add("3");
            list.add("4");
            list.add("5");
            System.out.println("Original list : " + list);
            System.out.println();
    
            Iterator<String> i = list.iterator();
            String temp = null;
            while (i.hasNext()) {
                temp = i.next();
                System.out.println("Check for " + temp);
                if ("4".equals(temp)) {
                    list.remove(temp);
                }
            }
            System.out.println("Removed  list : " + list);
        }
    
    }

    输出:

    Original list : [1, 2, 3, 4, 5]

    Check for 1
    Check for 2
    Check for 3
    Check for 4
    Removed  list : [1, 2, 3, 5]

  • 相关阅读:
    map-count
    map-count
    map-constructors
    map-constructors
    multiset-find
    multiset-find
    multiset-insert
    C++ string详解
    treap(树堆)
    程序设计语言的变革
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5335008.html
Copyright © 2011-2022 走看看