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

© 刘佳 中级黑马   /  2012-8-23 18:06  /  1515 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘佳 于 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迭代哪里出错了?

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
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);
  }

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 很给力!

查看全部评分

回复 使用道具 举报
for (Iterator<String> it = al.iterator(); it.hasNext();) {
                   String s="";
                   if(!newAl.contains((s=it.next())))//it.next()函数每调用一次指针自动向后移动一位,所以你原来的代码,是两次间隔的取元素所以结果自然不一样。你应该把每次next的结果保存下来!                          
                         newAl.add(s);
         }
          
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马