叶凡网络:动态删除ArrayList中的元素

2013-12-06 09:14:01 | 新闻来源:叶凡网络 | 点击量:616

昨天一位项目组同事需要在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();  

                 }  

 

             }  

         } 

上一篇:叶凡网络:为当选安理会非常任理事国 日本新任命两名参事 下一篇:叶凡网络:外媒:习近平拜登会面超时45分钟 拜登情绪低落