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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Dr.Sparta 中级黑马   /  2014-12-1 11:44  /  1930 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Dr.Sparta 于 2014-12-1 11:48 编辑

敲代码时遇到的问题
/*
去除ArrayList集合中的重复元素。
*/
public static ArrayList singleElement(ArrayList al)
{
ArrayList newAl = new ArrayList();

Iterator it = al.iterator();

while(it.hasNext())
{
//Object obj = it.next();

if(!newAl.contains(it.next()))
newAl.add(it.next());//这里如果不是obj,会NoSuchElementException

}

return newAl;
}
}
为什么不可以是it.next()?一直没想明白,it.next()返回的不也是一个对象吗?


评分

参与人数 1黑马币 +3 收起 理由
船长 + 3 赞一个!

查看全部评分

12 个回复

倒序浏览
本帖最后由 lishuliang28 于 2014-12-1 11:57 编辑

it.next() 不能这么用,每执行一次它,指向的位置会后移。while(it.hasNext())
{Object obj = it.next();
if(!newAl.contains(obj))
newAl.add(obj)
}

评分

参与人数 1黑马币 +3 收起 理由
船长 + 3

查看全部评分

回复 使用道具 举报
每执行一次next(),返回下一个元素的同时指针自动向后移一位,如果你这么写,判断if的时候已经取出了最后一个元素,在add()时又next了一次,因为已经没有元素了,所以就NoSuchElementException
回复 使用道具 举报
毕老师的视频中有将到该问题,,还是回去看视频吧
回复 使用道具 举报
你这是循环一次取出两个元素
回复 使用道具 举报
是啊是啊,你这样是取出两次了,昨天我试了一下也不可以的
回复 使用道具 举报
肯定没有好好看视频  哼哼:lol
回复 使用道具 举报 0 1
mmppp 中级黑马 2014-12-1 20:42:47
8#
一个hasNext,只能用一次next,不然就是一次跳了两下指针了。
回复 使用道具 举报
你每执行一次it.Next()的时候,指针就向右偏移一位了,每次迭代一次,代表的就是不同的it.next();
每次都执行两次。假设元素为奇数
当执行到后边的时候,会因为没有没有改元素,而抛出异常。


另外,使用泛型,会更好,让代码更加严谨,例子如下:


public class MapDemo2
{
     public static void main(String[] args)
     {
          Map<String,String> map = new HashMap<String,String>();
          map.put("01","zs1");
          map.put("02","zs2");
          map.put("03", "zs3");
         
          Set<String> keySet = map.keySet();
          for(Iterator<String> it = keySet.iterator();it.hasNext();)
          {
               String key = it.next();
               String value = map.get(key);
               System.out.println("key: "+key+", value: "+value);
          }
         
         
          Set<Map.Entry<String, String>> entrySet = map.entrySet();
          Iterator<Map.Entry<String, String>> it = entrySet.iterator();
          while(it.hasNext())
          {
               Map.Entry<String, String> me = it.next();
               String key = me.getKey();
               String value = me.getValue();
               System.out.println(key+" = "+value);
          }
     }

}
回复 使用道具 举报
你拿newAl去contains判断每一个元素?。。。
回复 使用道具 举报
还有it.next()方法,你在迭代器定义两次就是转了两次,你添加已经不是你比较的那个了,这程序毛病好多啊
回复 使用道具 举报
第一次调用it.next(),相当于创建了一个匿名对象,只能使用一次,第二次又创建了一个,已经不是同一个,一直往后取出的时候,超过范围当然就没有元素了
回复 使用道具 举报
来学习的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马