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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史卜坤 中级黑马   /  2012-7-13 15:26  /  1297 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.Vector;

public class test_Vector_Remove_All {

        public static void main(String[] args) {
                Vector<Integer> v = new Vector<Integer>();
                v.add(new Integer(11));
                v.add(new Integer(22));
                v.add(new Integer(33));
                v.add(new Integer(44));
                v.add(new Integer(55));
               
                for(int i=0; i<v.size();i++){
                        v.remove(i);                                 
                }
                for(int i=0; i<v.size();i++){
                        System.out.println(v.get(i));
                }
        }

}

发现第一次没删除完,输出结果居然是22 44 ?

3 个回复

正序浏览
            System.out.println(v.size());
            for(int i=0; i<v.size();i++){
                     System.out.println(i+" "+ v.remove(i));                             
            }
v.size是动态变化的
你这个第一次循环时,删除一个元素后,v.size()已经变成4,循环3次后,v.size()已经变成2了,此时i等于3,循环不满足条件停止循环,所以还有两个无法删除。
回复 使用道具 举报
本帖最后由 黑马刘涛 于 2012-7-13 16:24 编辑

不要使用for循环操作数据,Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件,也就是说,你用for循环删除数据时,索引i递增,而实际向量大小递减,你删除第一个数据正常,此时向量大小为4,i= 2,而向量remove方法是跟数组删除元素方法类似,都是元素左移,长度减1。因此你删除第二个元素实际上就变成了删除原来向量集合中的第3个元素了。自己可以用eclpse单步调试下,观察下集合元素的变换。建议你用迭代器,用迭代器中的remove方法。API里的说明就不贴了
修改下代码
  1. import java.util.*;

  2. public class testVectorRemoveAll {

  3.         public static void main(String[] args) {
  4.                 Vector<Integer> v = new Vector<Integer>();
  5.                 v.add(new Integer(11));
  6.                 v.add(new Integer(22));
  7.                 v.add(new Integer(33));
  8.                 v.add(new Integer(44));
  9.                 v.add(new Integer(55));
  10.                 //int size = v.size();
  11.                 ListIterator<Integer> listIter = v.listIterator();
  12.                 while(listIter.hasNext()){
  13.                                 listIter.next();
  14.                         listIter.remove();
  15.                 }
  16.                 for(int i=0; i<v.size();i++){
  17.                         System.out.println(v.get(i));
  18.                 }
  19.                 if(v.isEmpty())
  20.                         System.out.println("删除完毕");
  21.         }

  22. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 啸傲江湖007 于 2012-7-13 15:52 编辑

查询API,找到Vector对应的remove()方法
public E remove(int index)移除此向量中指定位置的元素。将所有后续元素左移(将其索引减 1)。返回此向量中移除的元素。

刚开始有五个元素,
第一次remove()减少一个,后续四个统一左移,索引又是从零开始,所以第二次remove()只是删掉索引为一的元素,而不是从零索引开始删除,这样相当于是隔着一个删掉一个。
public class test_Vector_Remove_All {

        public static void main(String[] args) {
                Vector<Integer> v = new Vector<Integer>();
                v.add(new Integer(11));
                v.add(new Integer(22));
                v.add(new Integer(33));
                v.add(new Integer(44));
                v.add(new Integer(55));
               
               for(int i=0; i<=v.size();i++){
                   System.out.println(v.remove(i)+ " ---"+v);  
               
            }
                for(int i=0; i<v.size();i++){
                        System.out.println(v.get(i));
                }
        }

}

打印结果:
11 ---[22, 33, 44, 55]
33 ---[22, 44, 55]
55 ---[22, 44]
22
44


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马