zoukankan      html  css  js  c++  java
  • 遍历List集合,删除符合条件的元素

    List集合的遍历有三种方式:增强for循环,普通for循环,Iterator迭代器遍历

    如果只是对集合进行遍历,以上三种循环都可正常遍历:

    (1)增强For循环遍历List集合

    List<Student> stuList = new ArrayList<Student>();
    for(Student stu : stuList){
        System.out.println(stu.getName());
    }

    (2)普通For循环遍历List集合

    1 List<Student> stuList = new ArrayList<Student>();
    2 for(int i = 0;i<stuList.size();i++){
    3      System.out.println(stuList.get(i).getName());       
    4 }   

    (3)迭代器遍历List集合

    List<Student> stuList = new ArrayList<Student>();
    Iterator iterator = stuList.iterator();
    while(iterator.hasNext()){
        System.out.println(iterator.next().getName());
    }

    然而,如果我们要遍历List集合,并删除符合条件的多个元素,则只能使用Iterator迭代器,其他两种都会报错,看下面的例子

    (1)增强For循环遍历List集合,并删除另外一个数组中name相同的元素

    List<Student> stuList = new ArrayList<Student>();
    String[] names = ["aaa","bbb","ccc"];//此处为举例子
    for(Student stu : stuList){
      for(String name : names){
         if(stu.getName() == name){
            stuList.remove(stu);/
    /第一次删除没有问题,当删除第二个元素的时候,会报ConCurrentModificationException异常
       }
       }
    }

    (2)普通For循环遍历List集合,并删除另外一个数组中name相同的元素

     List<Student> stuList = new ArrayList<Student>();
    String[] names = ["aaa","bbb","ccc"];//此处为举例子
    for(int i = 0;i<stuList.size();i++){
       for(String name : names){
         if(stuList.get(i).getName() == name){
          stuList.remove(i);//第一次删除没有问题,当多个删除的时候,会出现跳过个别元素的情况,不能完全遍历
       }

       }
    }

    (3)迭代器遍历List集合,并删除另外一个数组中name相同的元素

    List<Student> stuList = new ArrayList<Student>();
    String[] names = ["aaa","bbb","ccc"];//此处为举例子
    Iterator iterator = stuList.iterator(); while(iterator.hasNext()){
      Student stu = itreator.next();
      for(String name : names){
         if(stuList.get(i).getName() == name){
          iterator.remove();//此处采用iterator本身的remove方法,可以完美解决上述问题
       }
       }
    }
    原因:增强for循环也是利用内部的iterator来遍历集合的,Iterator工作在一个独立的线程中,iterator被创建后,会建立一个单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动时,找不到迭代对象,当iterator工作时,是不允许被迭代的对象改变的,但可以被自身改变,利用Iterator的remove方法进行删除。
  • 相关阅读:
    UVa532 Dungeon Master 三维迷宫
    6.4.2 走迷宫
    UVA 439 Knight Moves
    UVa784 Maze Exploration
    UVa657 The die is cast
    UVa572 Oil Deposits DFS求连通块
    UVa10562 Undraw the Trees
    UVa839 Not so Mobile
    327
    UVa699 The Falling Leaves
  • 原文地址:https://www.cnblogs.com/caogen1991/p/6048290.html
Copyright © 2011-2022 走看看