新手关于跌倒器iterator中next()方法的思考

作为Java初学者,在学习Set和Map时都会用到迭代器Iterator来遍历集合,其形式为

Iterator<?> it = set.iterator();

while(it.hasNext()){

System.out.println(it.next());

}

书上或视频教学上都是这么写的,没问题。可是我们在实际应用时发现,循环内部需要实现的不止是输出it.next(),还有其他的功能需求。比如我购物车中需要求商品的总价时,遍历集合时需要求得商品价格和商品数量的积,这时就需要调用getNumOfGoods()和getPrice()方法。代码如下:

这个时候运行结果为:

出异常了,(NoSuchElementException在 Iterator 接口的 next() 官网文档中有给出),为什么会出现这种异常呢?而且比较奇特的是如果迭代器中的元素个数为偶数时,不会出现这个异常,当然计算结果也是错的(大家可以自己动手试试)。这就要从next()这个方法本身入手。next()方法是返回跌代器中下一个元素,也就是每调用一次 next()方法,所返回的元素都是不同的。

上例中迭代器有三个元素:goods1、goods2、goods3。假设迭代器按这个顺序遍历元素:

第一次循环   hasNext() == true;

goodsIt.next().getNumOfGoods() 调用的是goods1中的numOfGoods

goodsIt.next().getPrice()调用的就是就是goods2中的price了

第一次循环的结果为 6000

第二次循环 hasNext() == true;(还有goods3,所以为true)

goodsIt.next().getNumOfGoods() 调用的是goods3中的numOfGoods

goodsIt.next().getPrice()则无元素可调用

第二次循环会出现异常:NoSuchElementException

所以会出现上图中的结果6000.0Exception。那偶数时为什么就不出现异常了呢?因为程序中有两个next()方法,假如迭代器中

只有两个元素 goods1 和 goods 2 ,那么第一次循环后,hasNext()为false,巧合的结束了循环,但是结果依然是6000.0(错误)。

那么我们想要遍历集合应该怎么办呢?可以使用强制循环(for-each循环)。






  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值