A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王璐 中级黑马   /  2012-6-15 11:59  /  1260 人查看  /  0 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

需要在ArrayList中删除所有不等于指定值的元素,但是弄了很久,发现总是删得不完全。后来发现是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
将一些删除方法做一些总结:

    /**  
  •       * 删除Arraylist中值为"c"的元素  
          */
  •      public static void main(String[] args) {  
               
  •          List<String> list = new ArrayList<String>();  
               
  •          //"c"在Arraylist不连续存储  
             /*  
  •          list.add("c");  
             list.add("a");  
  •          list.add("c");  
             list.add("b");  
  •          list.add("c");  
             list.add("d");  
  •          list.add("c");  
             */
  •            
             //"c"在Arraylist有连续存储  
  •          list.add("a");  
             list.add("c");  
  •          list.add("c");  
             list.add("b");  
  •          list.add("c");  
             list.add("c");  
  •          list.add("d");  
             list.add("c");  
  •            
               
  •          //删除Arraylist中值为"c"的元素  
               
  •          //有可能不能全部删除  
             //removeListElement1(list);  
  •            
             //能够正确删除  
  •          //removeListElement2(list);  
               
  •          //能够正确删除  
             //removeListElement3(list);  
  •      }  
          
  •       
         /**  
  •       *        删除list中值为"c"的元素  
          *   
  •       *   这种方式:  
          *     
  •       *   当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉  
          *     
  •       *   但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除  
          *   因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小  
  •       */
         public static void removeListElement1(List<String> list) {  
  •          for(int i=0;i<list.size();i++) {  
                 if("c".equals(list.get(i))) {  
  •                  list.remove(i);  
                 }  
  •          }  
               
  •      }  
          
  •      /**
          * 删除Arraylist中值为"c"的元素  
  •       *   
          * 这种方式:  
  •       *   
          * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除  
  •       */
         public static void removeListElement2(List<String> list) {  
  •          for(int i=0;i<list.size();i++) {  
                 if("c".equals(list.get(i))) {  
  •                  list.remove(i);  
                     --i;//删除了元素,迭代的下标也跟着改变  
  •              }  
             }  
  •      }  
          
  •      /**
          * 删除Arraylist中值为"c"的元素  
  •       *   
          * 这种方式:  
  •       *   
          * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除  
  •       *   
          * 需保证没有其他线程同时在修改  
  •       */
         public static void removeListElement3(List<String> list) {  
  •          Iterator<String> iterator = list.iterator();  
             while(iterator.hasNext()) {  
  •              String str = iterator.next();  
                 if("c".equals(str)) {  
  •                  iterator.remove();  
                 }  
  •                
             }  
  •      }

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马