黑马程序员技术交流社区

标题: arrayList遍历问题 [打印本页]

作者: qisikudingcha    时间: 2014-1-19 10:19
标题: arrayList遍历问题
本帖最后由 qisikudingcha 于 2014-1-23 15:08 编辑
  1. ArrayList<String> list = new ArrayList<String>();
  2.                 list.add("张三");
  3.                 list.add("李四");

  4.                 Iterator<String> it = list.iterator();

  5.                 while (it.hasNext()) {

  6.                         System.out.println(it.next());

  7.                         list.remove("张三");

  8.                 }
复制代码

这样子用不会报错,但是如果list中只添加一个“张三”元素,就会报错,这是为什么???
作者: 黄晓鑫    时间: 2014-1-19 10:28
判断一下 if(it.next().equals("张三"))然后再删除
作者: 。子伤。    时间: 2014-1-21 14:53
哥们不会的,你描述的是不是有点问题呢
作者: 。子伤。    时间: 2014-1-21 14:54
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. public class Itcast {
  4.         public static void main(String[] args) {
  5.                 ArrayList<String> list = new ArrayList<String>();
  6.                 // list.add("张三");
  7.                 list.add("李四");
  8.                 Iterator<String> it = list.iterator();
  9.                 while (it.hasNext()) {
  10.                         System.out.println(it.next());
  11.                         list.remove("张三");
  12.                 }
  13.         }
  14. }
复制代码

作者: qisikudingcha    时间: 2014-1-21 16:51
。子伤。 发表于 2014-1-21 14:54
  1. ArrayList<String> list = new ArrayList<String>();
  2.                 list.add("张三");


  3.                 Iterator<String> it = list.iterator();

  4.                 while (it.hasNext()) {

  5.                         System.out.println(it.next());

  6.                         list.remove("张三");

  7.                 }
复制代码

我的意思是这种情况就会报错,但是下面这种情况就不会,这是为什么
  1. ArrayList<String> list = new ArrayList<String>();
  2.                 list.add("张三");
  3.                 list.add("李四");

  4.                 Iterator<String> it = list.iterator();

  5.                 while (it.hasNext()) {

  6.                         System.out.println(it.next());

  7.                         list.remove("张三");

  8.                 }
复制代码

作者: 向阳泪无痕    时间: 2014-1-23 10:42
本帖最后由 向阳泪无痕 于 2014-1-23 11:03 编辑

先看看你的代码
  1. <p>while (it.hasNext()) {
  2. 08.
  3. 09.       System.out.println(it.next());
  4. 10.
  5. 11.        list.remove("张三");   //问题出在这,如果集合里面只有一个元素,而正好你又删除这个元素,那么这个时候这个集合就是空了,</p><p>                                              //这个时候在判断 it.hasNext()就会报异常
  6. 12.
  7. 13.    }
  8. </p>
复制代码


把你的  while循环   改成下面的方法就对了。。。

  1. while (it.hasNext()) {   //改成这样就对了
  2.                                                 
  3.             String s = it.next();

  4.             System.out.println(s);

  5.               if("张三".equals(s))
  6.                            it.remove();

  7.                 }
复制代码

作者: tuanjie    时间: 2014-1-23 11:41
对集合使用Iterator进行进行遍历时删除集合里面的元素,使用Iterator里面的remove方法删除集合里面的元素,而不用集合本身自带的remove方法。集合在遍历时,使用的是Iterator迭代器进行遍历,如果使用集合本身自带的remove方法进行删除时,集合的大小已经改变了,但是Iterator迭代器并不知道集合大小已经改变,遍历集合的时候依然使用原始的集合大小,就会出现问题。在对集合使用Iterator遍历的时候对集合进行添加时,也是使用迭代器里面的add方法。




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