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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯凯斌 中级黑马   /  2013-1-31 15:17  /  1564 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 侯凯斌 于 2013-2-18 11:46 编辑

需要在ArrayList中删除所有不等于指定值的元素,但是弄了很久,发现总是删得不完全。后来发现是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。
将一些删除方法做一些总结:
  1. /**  
  2.       * 删除Arraylist中值为"c"的元素  
  3.       */
  4.      public static void main(String[] args) {  
  5.            
  6.          List<String> list = new ArrayList<String>();  
  7.            
  8.          //"c"在Arraylist不连续存储  
  9.          /*  
  10.          list.add("c");  
  11.          list.add("a");  
  12.          list.add("c");  
  13.          list.add("b");  
  14.          list.add("c");  
  15.          list.add("d");  
  16.          list.add("c");  
  17.          */
  18.            
  19.          //"c"在Arraylist有连续存储  
  20.          list.add("a");  
  21.          list.add("c");  
  22.          list.add("c");  
  23.          list.add("b");  
  24.          list.add("c");  
  25.          list.add("c");  
  26.          list.add("d");  
  27.          list.add("c");  
  28.            
  29.            
  30.          //删除Arraylist中值为"c"的元素  
  31.            
  32.          //有可能不能全部删除  
  33.          //removeListElement1(list);  
  34.            
  35.          //能够正确删除  
  36.          //removeListElement2(list);  
  37.            
  38.          //能够正确删除  
  39.          //removeListElement3(list);  
  40.      }  
  41.       
  42.       
  43.      /**  
  44.       *        删除list中值为"c"的元素  
  45.       *   
  46.       *   这种方式:  
  47.       *     
  48.       *   当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉  
  49.       *     
  50.       *   但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除  
  51.       *   因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小  
  52.       */
  53.      public static void removeListElement1(List<String> list) {  
  54.          for(int i=0;i<list.size();i++) {  
  55.              if("c".equals(list.get(i))) {  
  56.                  list.remove(i);  
  57.              }  
  58.          }  
  59.            
  60.      }  
  61.       
  62.      /**
  63.       * 删除Arraylist中值为"c"的元素  
  64.       *   
  65.       * 这种方式:  
  66.       *   
  67.       * 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除  
  68.       */
  69.      public static void removeListElement2(List<String> list) {  
  70.          for(int i=0;i<list.size();i++) {  
  71.              if("c".equals(list.get(i))) {  
  72.                  list.remove(i);  
  73.                  --i;//删除了元素,迭代的下标也跟着改变  
  74.              }  
  75.          }  
  76.      }  
  77.       
  78.      /**
  79.       * 删除Arraylist中值为"c"的元素  
  80.       *   
  81.       * 这种方式:  
  82.       *   
  83.       * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除  
  84.       *   
  85.       * 需保证没有其他线程同时在修改  
  86.       */
  87.      public static void removeListElement3(List<String> list) {  
  88.          Iterator<String> iterator = list.iterator();  
  89.          while(iterator.hasNext()) {  
  90.              String str = iterator.next();  
  91.              if("c".equals(str)) {  
  92.                  iterator.remove();  
  93.              }  
  94.                
  95.          }  
  96.      }
复制代码
求给点技术分吧{:soso__11435681218001257602_2:}

评分

参与人数 2技术分 +1 黑马币 +2 收起 理由
Rancho_Gump + 1 很细心,请把帖子改已解决
陈科宇 + 2 赞一个!

查看全部评分

2 个回复

倒序浏览
这位朋友总结的很认真,学习态度必须赞一个。{:soso_e113:}
回复 使用道具 举报
其实删除完成后只要这样一句话就行,         helpAdapter.notifyDataSetChanged(),这样一句话解决N多的问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马