概述
一个iterator遍历数组的注意使用
前些天在项目中遇到了,感觉会忘记,特此记录一下。
大家都知道数组list在遍历的过程中不能直接remove,要使用iterator,如图:
Iterator<ConsigneeAccountVo> iterator = list.iterator();
while (iterator.hasNext()) {
ConsigneeAccountVo next = iterator.next();
if (next.getList().size() == 0) { //这里是你可以自定义的要判断条件
iterator.remove();
}
}
然后现在我在做一个“退款单”的需求,数据库中存在一个“退款工单表”和“退款单对应品表”,一个退款单可能对应多个退货商品,外键是退款工单的id,如图
某个订单在用户申请退款以后,如果这个订单里是一单多商品的订单,用户还能对该订单进行操作,当然操作的时候能退的商品只能选择没退货过的商品。在有一个全部商品的list的情况下,应该怎么从一堆商品里筛选掉已经被退款过的商品呢?
踩过坑,直接告诉你此处应该搭配for (int i = list.size(); i >0; i–) {逻辑}来写,而且是用-1倒着来遍历,不记得为啥得这样写了- - 贴代码~
// 遍历,筛掉已经申请过退款单的商品 orderItemModel就是需要遍历的商品集
for (int i = orderItemModel.size(); i >0; i--) {
//**注意点1** 构造对象的iterator
Iterator<OrderItemModel> ite = orderItemModel.iterator();
// 商品id --此处(i-1),不然可能会数组越界
Long goodsId = orderItemModel.get(i-1).getGoodsId();
// 类型转换
int gid = new Long(goodsId).intValue();
// 一个单号可能对应存在多个退款单,重写一个dao,根据单号,拿到退款单集合
List<RefundOrderModel> refundOrders = refundOrderDao.getRefundOrders(order.getExternalCode());
// 如果list查到全是作废的单,上面会为空,直接返回 此处返回空交给前端处理即可
if (CollectionUtils.isEmpty(refundOrders)){
return orderItemModel;
}
// 有数据处理
for (RefundOrderModel refundOrder : refundOrders) {
Long rfid = refundOrder.getId();
// 根据退款单id和商品id,看该工单这个品是否已经申请过退款
RefundGoodsModel gmodel = refundGoodsDao.getByRefundIdAndGoodsId(rfid, gid);
// 如果存在,那就去掉,不让用户选
if (gmodel != null) {
// 把ite中每一个对象和退款单中的商品id比较,看商品集合中,存不存id与“退款单对应品表”中找到的对象的商品id相同
while (ite.hasNext()) {
OrderItemModel next = ite.next();
// 比较,有相同就删掉
if (next.getGoodsId().equals(Long.valueOf(gid))) {
ite.remove();
// 一个“退款单对应品表”对象只对应一个品,既然已经找到了,免得浪费时间和资源,跳出最近的for循环,回到第二行直接进行下一次for循环
break;
}
}
}
}
// 集合里的元素如果都删完了,那就没了,返回空给前端处理,如果不加这个,在下次循环时会报错
if (CollectionUtils.isEmpty(orderItemModel)) {
return null;
}
}
就这样就能解决啦,不过感觉循环嵌套的还是有点多的,后续再看看能不能优化了。
注意:代码标注注意点处的构造对象的iterator,一定要在循环内new一个出来,确保每次都是新的iterator,不然他每next一次,指针就会指向下一位,会报越界,空指针,或者iterator专有的一个错,简单来说这是个“一次性”的东西,如果上面定义过全局的iterator,循环内记得要new一个新的来循环。
最后
以上就是清脆烧鹅为你收集整理的记一次,iterator遍历数组的注意与使用的全部内容,希望文章能够帮你解决记一次,iterator遍历数组的注意与使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复