【记坑】Iterator遍历时,多次调用next(),二次遍历需要从Collection重新获取迭代器

博客讲述了在使用Java Iterator遍历集合时遇到的问题,即在遍历过程中多次调用next()导致二次遍历失效。解释了Iterator的工作原理,包括hasNext()、next()和remove()方法的细节,并强调了当遍历完成后,若需再次遍历,必须重新获取迭代器。同时指出,连续调用next()会改变迭代器的索引位置,影响后续遍历。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务需求,从一份excel表中取到X轴(项目)和Y轴(平台)的数据,和数据库中的数据进行比较,如果匹配不上,则把所有匹配不上的信息返回前端,当时采取的是
List<ProjectVo> shareProjects = projectMapper.selectAllShareProject();
List<ProjectVo> sharePlats = projectMapper.selectAllSharePlat();
for (int i = 0; i < header.getLastCellNum(); i++) {
  Cell cell = header.getCell(i);
  String projectName = cell.getStringCellValue();
  for (ProjectVo shareProject : shareProjects) {
      List<String> nameList = ExcelHelper.buildProjectUsedNames(shareProject);
      String pureProjectName = ExcelHelper.trimSpaceAndSpecialSymbol(projectName);
      if (nameList.contains(pureProjectName)) {
          columnMap.put(columnId, shareProject.getId());
          break;
       }
    }
}

这样只能判断excel中的现有数据是否和数据库匹配,无法判断数据库的数据是否全部存在excel表中,并且我觉得每次遍历一个完整的Collection让我觉得浪费性能。于是改成了如下


List<ProjectVo> shareProjects = projectMapper.selectAllShareProject();
Iterator<ProjectVo> shareProjectIterator = shareProjects.iterator();
List<ProjectVo> sharePlats = projectMapper.selectAllSharePlat();
Iterator<ProjectVo> sharePlatIterator = sharePlats.iterator();
String projectName = cell.getStringCellValue();
String pureProjectName = ExcelHelper.trimSpaceAndSpecialSymbol(projectName);
while (shareProjectIterator.hasNext()) {
     ProjectVo item = shareProjectIterator.next();
     List<String> nameList = ExcelHelper.buildProjectUsedNames(item);
     if (nameList.contains(pureProjectName)) {
         columnMap.put(columnId, item.getId());
         shareProjectIterator.remove();
         break;
     }
 }
String platName 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值