首页 > 试题广场 >

假设num已经被创建为一个ArrayList对象,并且最初包

[单选题]
假设num已经被创建为一个ArrayList对象,并且最初包含以下整数值:[0,0,4,2,5,0,3,0]。 执行下面的方法numQuest(),数组num会变成?
private List<Integer> nums;

//precondition: nums.size() > 0
//nums contains Integer objects
public void numQuest() {
    int k = 0;
    Integer zero = new Integer(0);
    while (k < nums.size()) {
        if (nums.get(k).equals(zero))
            nums.remove(k);
        k++;
    }
}


  • [3, 5, 2, 4, 0, 0, 0, 0]
  • [0, 0, 0, 0, 4, 2, 5, 3]
  • [0, 0, 4, 2, 5, 0, 3, 0]
  • [0, 4, 2, 5, 3]
做这种题还是要一步一步来,不然一不小心就掉坑里:
List中的 get ( i )指的是获取下标(索引)为 i 的元素,也就是第 i+1 个元素
本题:
zero==0,如果get(k)==0,执行remove(k); ;
           size==8 ; k==0 , 因此第一次remove(0) ,删除索引为0的元素也就是第一个元素0,然后k++, size()--;
此时集合元素为 :[0,4,2,5,0,3,0]
           size==7; k==1,因此get(1)==4 !=0 , 不执行remove();  k++,因没有删除元素,size()不变,
此时集合元素为:[0,4,2,5,0,3,0]
            size==7;k==2,k++;
            size==7;k==3,k++;
            size==7;k==4,get(4)==0,remove(4) ;  k++,  size()--; 
此时集合元素为: [0,4,2,5,3,0]
            size==6;k==5,get(5)==0,remove(5);k++, size()--;
此时集合元素为: [0,4,2,5,3]
            size==5; k==6 ;退出循环;最终输出此时集合元素为    [0,4,2,5,3]
一般更改删除集合元素,使用iterator()迭代器,不推荐使用这种;
发表于 2019-08-24 09:29:35 回复(26)
结果中数组的第一个元素 0 是 原数组中的第二个0。
这个程序就是在删除数组中的0 ,但是会有个小问题,就是连续的0会只删除一个。
原因:当执行remove的时候,ArrayList 数组的 size 会变小一个,原本的位置上的 0 会被后面的 0 给替代;而在执行完remove后执行了k++;所以跳过了第二个0
发表于 2019-10-05 16:03:51 回复(3)
关键在于 每次remove 之后 数组的长度会-1  但是获取数据的下标会+1
发表于 2020-01-10 14:30:36 回复(1)
我估计这个题多一个[4,2,5,3]错的人多30%
发表于 2020-11-23 16:27:34 回复(2)
此题中,ArrayList的泛型为Integer(泛型类型都为对象类型),Integer重写了equals方法,两个Integer对象比较的是值。
发表于 2022-01-25 12:14:04 回复(0)
此方法的目地就是排除重复元素
发表于 2019-08-21 12:52:18 回复(1)
谁开发中这么写打死他
发表于 2021-10-01 12:44:14 回复(0)
<p>这题考点在于删除了数组中的元素,数组中的下标会因为元素的删除而下标前移 所以如果连续两个都需要删除的元素则会因为下标-1而漏掉,如果是倒着i--从后面开始执行则不会有这个问题</p>
发表于 2020-11-28 00:31:45 回复(0)
要注意remove后,数组size-1,而遍历的下标会+1
一个为0,下标也为0,remove,此时数组size-1,下标为0的是原数组的第二个数也是0,但是遍历的k+1,这时比较的是下标为1的数,也就是4了,以此类推,很好理解,答案就是D.
编辑于 2021-12-23 11:06:25 回复(0)
Integer.equals比较的是值   list删除了元素之后 size大小也会发生改变 故元素位置也发生改变
编辑于 2023-03-09 15:35:38 回复(0)
哪里有输出?😁
发表于 2020-09-26 12:13:05 回复(2)
循环的运用
发表于 2022-03-31 08:08:53 回复(0)
删除了一个0,后面的会向前补位,刚补上上来的第一位,因为k++,正好躲过了判断,所以第二个0会活下来
发表于 2021-10-21 17:43:16 回复(0)
删除了一个0,后面的会向前补位,刚补上上来的第一位,因为k++,正好躲过了判断,所以第二个0会活下来
发表于 2021-08-24 22:21:07 回复(0)
获取下标索引,arraylist的get方法
发表于 2021-04-30 09:40:17 回复(0)
将第0个位置对应的值去掉,则会有i指向1,这时数组为【0,4,2,5,0,3,0】指向4,第一个0忽略掉。
发表于 2020-08-03 16:50:38 回复(0)
remove方法有两个,一个是Object参数一个是index参数,这题中k是一个int值所以调用的是index参数的那个remove方法。
发表于 2020-06-04 18:00:47 回复(0)
当remove链表中的第一个0时,数组长度减了一,因此,下一次k=1时,链表指向了4,第二个0没有被删除。即该方法可以删除链表内不相邻的0
发表于 2020-04-21 20:45:20 回复(0)
其实只有一个关键点,那就是当执行remove的时候,ArrayList 数组的 size 会变小1。
发表于 2020-03-08 02:24:33 回复(0)
题目真有意思,细啊
发表于 2019-11-29 11:14:54 回复(0)