黑马程序员技术交流社区

标题: 关于it.next()的疑问,望大神解惑 [打印本页]

作者: Dr.Sparta    时间: 2014-12-1 11:44
标题: 关于it.next()的疑问,望大神解惑
本帖最后由 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()返回的不也是一个对象吗?



作者: lishuliang28    时间: 2014-12-1 11:55
本帖最后由 lishuliang28 于 2014-12-1 11:57 编辑

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


作者: (づ ̄_3 ̄)づ    时间: 2014-12-1 12:22
每执行一次next(),返回下一个元素的同时指针自动向后移一位,如果你这么写,判断if的时候已经取出了最后一个元素,在add()时又next了一次,因为已经没有元素了,所以就NoSuchElementException
作者: as604049322    时间: 2014-12-1 14:58
毕老师的视频中有将到该问题,,还是回去看视频吧
作者: DamonZh    时间: 2014-12-1 18:46
你这是循环一次取出两个元素
作者: caobin    时间: 2014-12-1 19:48
是啊是啊,你这样是取出两次了,昨天我试了一下也不可以的
作者: LOVE你的ME    时间: 2014-12-1 20:23
肯定没有好好看视频  哼哼:lol
作者: mmppp    时间: 2014-12-1 20:42
一个hasNext,只能用一次next,不然就是一次跳了两下指针了。
作者: 大大的心    时间: 2014-12-1 22:22
你每执行一次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);
          }
     }

}

作者: jcde2014    时间: 2014-12-1 22:42
你拿newAl去contains判断每一个元素?。。。
作者: jcde2014    时间: 2014-12-1 22:45
还有it.next()方法,你在迭代器定义两次就是转了两次,你添加已经不是你比较的那个了,这程序毛病好多啊
作者: cczheng    时间: 2014-12-2 08:30
第一次调用it.next(),相当于创建了一个匿名对象,只能使用一次,第二次又创建了一个,已经不是同一个,一直往后取出的时候,超过范围当然就没有元素了
作者: 斷灬dian    时间: 2014-12-29 12:01
来学习的




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