黑马程序员技术交流社区

标题: 删除元素。。 [打印本页]

作者: 史卜坤    时间: 2012-7-13 15:26
标题: 删除元素。。
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 ?
作者: 黑马振鹏    时间: 2012-7-13 15:47
本帖最后由 啸傲江湖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



作者: 黑马刘涛    时间: 2012-7-13 15:56
本帖最后由 黑马刘涛 于 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. }

复制代码

作者: 淡然    时间: 2012-7-13 16:59
            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,循环不满足条件停止循环,所以还有两个无法删除。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2