黑马程序员技术交流社区

标题: for迭代问题【已解决】 [打印本页]

作者: 刘佳    时间: 2012-8-23 18:06
标题: for迭代问题【已解决】
本帖最后由 刘佳 于 2012-8-23 19:27 编辑

import java.util.*;
class ArrayListTest
{
public static void sop(Object obj)
{
  System.out.println(obj);
}
public static ArrayList singleElement(ArrayList al)
{

  ArrayList newAl = new ArrayList();
  
  for (Iterator it = al.iterator(); it.hasNext(); )
  {
   
   if(!newAl.contains(it.next()))
    newAl.add(it.next());
  }

  

  return newAl;
}

public static void main(String[] args)
{
  ArrayList al = new ArrayList();
  al.add("java01");
  al.add("java02");
  al.add("java01");
  al.add("java02");
  al.add("java03");
  al.add("java04");
  sop(al);
  al = singleElement(al);
  sop(al);
}
}

为何我将while迭代换成for的以后,打印结果不对呢,上面的for迭代哪里出错了?

作者: 唐杨老师    时间: 2012-8-23 18:45
for (Iterator it = al.iterator(); it.hasNext(); )
{
   if(!newAl.contains(it.next()))       //这里的it.next()是取得下一个元素并返回元素值,内部指针向后移动一位
    newAl.add(it.next());                //而这里add的就是it的再下一个值了,因为上一个值被用来判断了.所以每循环一次少一个
  }
  
解决方法:定义成一个变量,然后调用该变量的引用,如下
for (Iterator it = al.iterator(); it.hasNext(); )
{  Object obj = it.next();
   if(!newAl.contains(obj))
    newAl.add(obj);
  }
作者: 杜鹏云    时间: 2012-8-23 19:20
for (Iterator<String> it = al.iterator(); it.hasNext();) {
                   String s="";
                   if(!newAl.contains((s=it.next())))//it.next()函数每调用一次指针自动向后移动一位,所以你原来的代码,是两次间隔的取元素所以结果自然不一样。你应该把每次next的结果保存下来!                          
                         newAl.add(s);
         }
          




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