操作list的remove造成数据错位

发布时间 2023-03-28 15:53:23作者: haowe

直接移除数据会出现异常

比如list的大小为2,下标为1 我进行遍历,size为0时,发现不符合我的要求我就进行移除, list的大小就为1,下标就变成了0,原来下标为1的数据就顶替了下标为0的数据 然后for循环就会自动跳出,因为程序认为自己遍历了下表为0的数据,下一条数据又没了 实际上现在下标为0的数据,就是原来的第二条,这样就会造成数据错位

我们就需要用到迭代器iterator,它是一个超级接口,隔离对容器的遍历操作和底层实现,从而解耦。 hasnext()方法是判断是否还有元素 next()方法是获取下一个元素 remove()方法是移除当前的对象

 

List<RecPaperBorrowReturnResponse> list= iPage.getRecords();
int num=0;

RecPaperBorrowReturnResponse response;
//把list放入迭代器,避免直接操作list造成数据错位
Iterator<RecPaperBorrowReturnResponse> iterator= list.iterator();
 while (iterator.hasNext()){
     response=iterator.next();
     Date now=new Date();
     Date borrowTime=response.getBorrowTime();
     borrowTime= DateUtils.addDays(borrowTime,response.getBorrowDays());

     if (DateUtils.afterDate(now,borrowTime)){
         long overdueDay= DateUtil.betweenDay(borrowTime,now,true);
         if (overdueDay>0){
             response.setOverdueDays(String.valueOf(overdueDay));
         }
     }else{
         //如果勾选超期,就移除未超期的list
         if (request.getOverdue()!=null&&request.getOverdue()==1){
             iterator.remove();
             num++;
         }
     }
 }