while (li.hasNext())
{
if (!(nl.contains(li.next())))
nl.add(li.next());
}
错误就在这个循环里面的两个:li.next()
第一次判断的时候: if (!(nl.contains(li.next()))),迭代器下标(姑且如此理解)会移动到0,
然后判断为true,进入:nl.add(li.next());,这里又调用了next方法,迭代器下标会移动到1。
然后进入下个循环,进行判断的时候,迭代器下标已经是2了。少判断下标为1的。
=你每次循环,迭代器都向后移动了两次。。。
li.next方法你理解的不好。调用此方法是取迭代器中下一个元素,迭代器下标+1。
li.hasNext 是是否有下个元素,迭代器下标不变。
你的修改是正确的,li.next,缓存到一个变量。判断,然后添加到 最后结果。这样每个循环只调用一次 next(每过一个循环,迭代器下标+1),符合要求 。
这是因为 li.next(); 会将li 返回当前元素,并且指向下一个元素,即执行了一次,下次在执行 li.next()返回的就是下一个元素了。
if(!(nl.contains(li.next())))
nl.add(li.next()); //这里执行了两次next(),却没有进行判断 hasNext(),当上一次next() 已经到达li 尾部时,这里当然就要报错了。
获取的是一个object,需要类型转换下,想了解的更清楚可以看原代码
因为你没next()一次,就到下一个值了,仔细打印看看。在你
while(li.hasNext())
{
if(!(nl.contains(li.next())))
nl.add(li.next());
}
这个迭代器里面
add(li.next());
这个li.next()的值跟
nl.contains(li.next()))这个是不一样的。而你放进obj等于这个不用解释了吧