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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2012 中级黑马   /  2013-9-17 13:22  /  1588 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-22 21:07 编辑

public class TestDemo{
public static void main(String[] args){
List<String> list=new ArrayList<String>();
list.add("aa");
list.add("bb");
  list.add("cc");
list.add("dd");
list.add("ff");
for(int i=0;i<list.size();i++){
list.remove(list.get(i));
}
}
}
这段代码那里有错呢?希望大神帮忙看看。

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

7 个回复

倒序浏览
首先要引入java.util.*包
其次第三行应该写成ArrayList<String> list=new ArrayList<String>();
回复 使用道具 举报
两个地方有问题,1,i<list.size();list每移除一个原因,list大小减一;2,list.remove(list.get(i));
应该改成list.remove(0),因为没移除一个元素,下一个元素的索引自动减1,
  1. public class TestDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 List<String> list = new ArrayList<String>();
  6.                 list.add("aa");
  7.                 list.add("bb");
  8.                 list.add("cc");
  9.                 list.add("dd");
  10.                 list.add("ff");
  11.                
  12.                 int k = list.size();
  13.                 for (int i = 0; i < k; i++)
  14.                 {
  15.                         list.remove(0);
  16.                 }
  17.         }
  18. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

回复 使用道具 举报
代码没错,应该是包导入的问题。
回复 使用道具 举报
你的代码中i<list.size()出现角标越界,因为ArrayList的底层数据结构是数组。应该改为i<list.size()-1。
回复 使用道具 举报
1,对于ArrayList底层实现的是数组结构,循环是按照数组角标往下遍历。
2,对于remove方法中,每次删除一个元素之后,自然ArrayList集合中就少了一个元素,指针也就向下走一个位置。
3,List引用指向父类引用,这使多态的体现,能提高程序的效率。
所以
for(int i=0;i<list.size();i++){
list.remove(list.get(i));
}
中remove方法可以改成remove(list.get(0));

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您好,我在你的代码中加了一些测试代码,有助于你的理解,最后对结果进行了解释,希望对你有帮助。
import java.util.ArrayList;
import java.util.List;
public class TestDemo{
public static void main(String[] args){
  List<String> list=new ArrayList<String>();
  list.add("aa");
  list.add("bb");
  list.add("cc");
  list.add("dd");
  list.add("ff");
  System.out.println(list.size());   //测试代码   结果是5.
  //System.out.println(list.remove(list.get(0)));  //测试代码      只运行这行代码结果是true
  //System.out.println(list.get(0));    //测试代码   只运行这行代码结果是aa
  for(int i=0;i<list.size();i++){
   list.remove(list.get(i));   //只运行这行代码,结果是空白
   //System.out.print(list.remove(list.get(i)));    //测试代码 只运行这行代码结果是truetruetrue(3个true)
   //System.out.print(list.get(i));        //测试代码   只运行这行代码结果是aabbccddff(即打印出所有元素)
  // System.out.print(list.remove(i));     //测试代码  只运行这行代码结果是aaccff
  }
}
}
/*
*
* 从上面的测试中我们就可以看出,问题出在对remove方法的理解上。
* 集合中的remove方法:
* 有两种:
* E remove(int index)
* Removes the element at the specified position in this list (optional operation). Shifts any subsequent elements to the left (subtracts one from their indices). Returns the element that was removed from the list.
* boolean remove(Object o)
* Removes the first occurrence of the specified element from this list, if it is present (optional operation). If this list does not contain the element, it is unchanged. More formally, removes the element with the lowest index i such that (o==null ? get(i)==null : o.equals(get(i))) (if such an element exists). Returns true if this list contained the specified element (or equivalently, if this list changed as a result of the call).
* remove方法的参数需要的是集合中元素的角标而不是元素本身,当你将角标传递给remove时,它会移除对应的元素,并且将其返回,这样我们就可以打印出这个元素了。而如果你传递给remove一个对象,那么就会返回boolean值,true或false。这可以解释你得到的现象。
* 另外,需要注意的是当把一个元素移除之后,它会将集合中剩余的元素进行角标的左移,所以在我们的最后一行代码中,当i=1时,对应的元素不再是bb,而是cc,所以将cc移除了,同理下一次移除的是ff。这样就看到了最后一个测试代码指出的结果。也可以解释倒数第三行代码看到的3个true的结果了。
*/

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
亲,有两个问题:
1、编译的时候报错,是因为没有导入import java.util.*包,导入这个包,编译没有问题。
2、运行时的问题,你用的这个remove方法是要把每个数组中的元素循环要删除掉吗,要是这样的话,你的代码写的就有问题,每循环完一次,数组的大小都有变化的,第一次数组大小是5,再循环一次,数组的长度就变成4,每循环一次数组的长度都减一。你这样的写代码只能删除了aa,cc,ff.   bb,dd,删除不了!

正确的写法如下:
import java.util.*;
class TestDemo{
public static void main(String[] args){
List<String> list=new ArrayList<String>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ff");
System.out.println(list.size());
int k = list.size();
for(int i=0;i<k;i++){//这样k的值就是固定的,不会根据数组的循环移除而变化!list.remove(0);
}

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

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