黑马程序员技术交流社区

标题: 迭代输出! [打印本页]

作者: 武庆东    时间: 2012-9-14 23:53
标题: 迭代输出!
public class IteratorDemo
{
        
        public static void main(String[] args)
        {
                String [] str = {"hi","hell","world"};               
                List<String> li = Arrays.asList(str);

                Iterator<String> it = li.iterator();
                while(it.hasNext())
                {
                    it.remove();
                }
                System.out.println(li);
        }

}
出现异常:Exception in thread "main" java.lang.IllegalStateException
    at java.util.AbstractList$Itr.remove(AbstractList.java:356)
    at com.wd.IteratorDemo.main(IteratorDemo.java:21)
怎么修改?


作者: 寇龙飞    时间: 2012-9-15 00:21
这是修改部分:
  1. while (it.hasNext()) {
  2.                         String str1 = it.next();//it.next()返回迭代的下一个元素,赋值给str1
  3.                         System.out.println(str1);
  4.                 }
复制代码
这是全部代码:
  1. package com.itheima.test;

  2. import java.util.Arrays;
  3. import java.util.Iterator;
  4. import java.util.List;

  5. public class IteratorDemo {

  6.         public static void main(String[] args) {
  7.                 String[] str = { "hi", "hell", "world" };
  8.                 List<String> li = Arrays.asList(str);

  9.                 Iterator<String> it = li.iterator();
  10.                 while (it.hasNext()) {
  11.                         String str1 = it.next();//it.next()返回迭代的下一个元素,赋值给str1
  12.                         System.out.println(str1);
  13.                 }
  14.                
  15.         }

  16. }
复制代码

作者: 武庆东    时间: 2012-9-15 00:28
寇龙飞 发表于 2012-9-15 00:21
这是修改部分:这是全部代码:

什么原因造成原来代码报出异常!这段代码,好像不是想要的哟!
作者: 张榆    时间: 2012-9-15 00:51
Iterator迭代器在迭代过程中不能对集合中的元素进行增删操作,只用List集合特有的ListIterator迭代器才有这功能。
作者: 黑马张涛    时间: 2012-9-15 00:53
在API中查到:asList
public static <T> List<T> asList(T... a)返回一个受指定数组支持的固定大小的列表(对返回列表的更改会“直接写”到数组。))//这里说了这种方式返回的是一个固定大小的列表(因为数组是固定大小的),不能remove。
而且即使你能用remove,你在调用remove之前没有调用it.next()方法,所以抛出那个异常,API中提到了的。
作者: 覃宏海    时间: 2012-9-15 01:11
public static void main(String[] args)
     {
                 /*
             String [] str = {"hi","hell","world"};               
             List<String> li = Arrays.asList(str);------------------>此类包含用来操作数组(比如排序和搜索)的各种方法。
                                                                                      此类还包含一个允许将数组作为列表查看的静态工厂。
          */                                                                         因此用Arrays这个方法是不能对数组进行增删操作的!
                 ArrayList<String> li = new ArrayList<String>();
                 li.add("hi");
                 li.add("hell");
                 li.add("world");
         Iterator<String> it = li.iterator();
         while(it.hasNext())
         {
            // it.remove();
            it.next();
          }
          li.remove(1);
          System.out.println(li);
     }
作者: 张飞年    时间: 2012-9-15 01:19
经过我的测试,这里有两方面的问题:
1、在iterator.remove()方法前需要有iterator.next()操作的出现。原因如API所说:“IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。”代码应改为类似这样的:
  1. while (it.hasNext()) {
  2.                         System.out.println(it.next());//此处可以加个判断或者输出,总之有next()就行
  3.                         it.remove();
  4.                 }
复制代码
2、当上面的内容改完之后还会出现一个问题,也是remove的错,不过这时的原因可以往上看(因为用 了Arrays.asList(str)),报告的是UnsupportedOperationException异常,这里错误的根本性原因就是java语义的问题. 对于String[]类型来说, 你不可以删除里面的元素, 而导致后续的元素移动.所以应该抛出这个异常,为什么说是操作String[]类型呢?查看api:(asList)返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直写”到数组。)问题就在这里,asList返回的不是“传统”意义上的List,而是对数组包装了一下,本质还是数组,所以不能够remove。注意上面那句帮助原文:对返回列表的更改会“直写”到数组。所以我们要用remove还是先用add方法老实来吧,写一个循环填加元素:
  1.         public static void main(String[] args) {
  2.                 String[] str = { "hi", "hell", "world" };
  3.                 //List<String> li = Arrays.asList(str);
  4.                 List<String> li = new ArrayList<String>();
  5.                 for (int i = 0; i < str.length; i++) {//循环填加元素
  6.                         li.add(str[i]);
  7.                 }       
  8.                 Iterator<String> it = li.iterator();
  9.                 while (it.hasNext()) {
  10.                         System.out.println(it.next());//调用remove之前先调用next方法
  11.                         it.remove();
  12.                 }
  13.                 System.out.println(li);
  14.         }
复制代码

作者: 谭立文    时间: 2012-9-15 01:35
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

public class test
{
        
        public static void main(String[] args)
        {
                List<String> c = new ArrayList<String>();
                for(int i = 0; i < 10; i++)
                {
                        c.add(i + "");
                }
                Iterator<String> it = c.iterator();
                int count = 0;
                while(it.hasNext())
                {
                        if(count == 2)  //当满足每个条件时 停止迭代
                        {
                                it.remove();  //删除最后迭代的数据 即最后一次next返回的数据
                                //这里为 1
                                break;
                        }
                        System.out.println(it.next());
                        count++;
                }
                it = c.iterator();  //重新初始化迭代器迭代 观察结果 没有数据 1了
                System.out.println("---------------------");
                while(it.hasNext())
                {
                        System.out.println(it.next());
                }
        }

}

作者: 寇龙飞    时间: 2012-9-15 10:29
武庆东 发表于 2012-9-15 00:28
什么原因造成原来代码报出异常!这段代码,好像不是想要的哟!

你标题都说了迭代输出。我帮你解决了。你又说不是你想要的。那你想要什么?a girl?那你说清楚嘛。。。




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