黑马程序员技术交流社区

标题: 集合框架,迭代器问题? [打印本页]

作者: 黑马杨晨    时间: 2012-9-19 13:30
标题: 集合框架,迭代器问题?
本帖最后由 黑马杨晨 于 2012-9-23 14:03 编辑

import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
  //演示列表迭代器。
  ArrayList al = new ArrayList();
  
  //添加元素
  al.add("java01");
  al.add("java02");
  al.add("java03");
  
  //在迭代过程中,准备添加或者删除元素。
  Iterator it = al.iterator();
  
  while(it.hasNext())
  {
   Object obj = it.next();
   
   if(obj.equals("java02"))
   {
    al.remove("java01"); //移除元素,这句好像有问题?
   // al.add("java008");
   }
   
   System.out.println("obj="+obj);
  }
}
}
红色代码不对吗?
结果为什么是这样呢?




作者: 陈俊来    时间: 2012-9-19 14:05
很简单,
// 在迭代过程中,准备添加或者删除元素。
                        Iterator it = al.iterator();

                        while (it.hasNext()) {
                                Object obj = it.next();
                                if (obj.equals("java02")) {
                                        al.remove("java01"); // 移除元素,这句好像有问题?
                                        //al.add("add");
                                }
                                System.out.println("obj=" + obj);
                        }
一开始,al里面有3个对象,
while循环打印了第一个对象java01,也就是obj=java01
当到第二个对象java02的时候移除了java01,然后打印了第二个对象java02,也就是obj=java02,这时候al里面就只有2个对象了,所以while(id.hasNext())就不往下执行了,
最后就只打印出了
obj=java01
obj=java02

作者: 董志超    时间: 2012-9-19 14:26
import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
  //演示列表迭代器。
  ArrayList al = new ArrayList();

  //添加元素
  al.add("java01");
  al.add("java02");
  al.add("java03");

  //在迭代过程中,准备添加或者删除元素。
  Iterator it = al.iterator();

  while(it.hasNext())
  {
  Object obj = it.next();
   it.remove();// 从迭代器指向的collection中移除迭代器返回的最后一个元素
    sop(al);

  }
}
public static void sop(Object obj)
{
        System.out.println("obj="+obj);
}
}
//运行一下吧



作者: 赵永康    时间: 2012-9-19 15:39
ArrayList的迭代器是不支持删除、增加动作的。因为是他结构是数组结构的。只有查找很方便、快捷的!
你把集合改成LinkList试试就可以了,他有自己的自身迭代器listIterator 你用这个迭代器就可以支持删除 增加之类的啦
作者: 王自强    时间: 2012-9-19 15:59
import java.util.*;
class ListDemo
{
public static void main(String[] args)
{
  //演示列表迭代器。
  ArrayList al = new ArrayList();
  
  //添加元素
  al.add("java01");
  al.add("java02");
  al.add("java03");
  
  //在迭代过程中,准备添加或者删除元素。
  Iterator it = al.iterator();
  
  while(it.hasNext())
  {
   Object obj = it.next();
   
   if(obj.equals("java02"))
   {
    al.remove("java01"); //这句执行后,集合中只有两个元素了,再判断while(it.hasNext()),结果为false了,就退出循环了。
   // al.add("java008");
   }
   
   System.out.println("obj="+obj);//第二次打印的obj记录的是java02,会打印出来的
  }
}
}
al中记录的是在while循环前的集合中的值,最好不要在迭代过程中使用集合对象的增删方法,会发生逻辑错误,在迭代过程中要使用迭代器的增删方法。







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