在循环内使用多个并列for循环生成报表是否有更优实现方案?
你当前写的并列循环逻辑存在明显的逻辑问题:townList是全局独立列表,没有按国家过滤的话,会在每个国家的城市行生成完成后,把所有国家的城镇都输出一遍,和你给出的报表格式要求不符。
下面是适配需求的最优实现方案:
方案1:提前按国家对城镇分组(推荐)
只需要对城镇列表做一次预处理,按所属国家分组生成映射表,后续遍历国家时直接取对应城镇列表即可,性能和可读性都最优。
// 预处理:仅执行一次,将城镇按所属国家分组 Map<Country, List<Town>> countryTownMap = townList().stream() .collect(Collectors.groupingBy(Town::getCountry)); for (Country country : countryList) { // 生成当前国家的所有城市行 for (City city : country.getCityList()) { generateRow(country, city); } // 生成当前国家的所有城镇行 List<Town> currentCountryTowns = countryTownMap.getOrDefault(country, Collections.emptyList()); for (Town town : currentCountryTowns) { generateRowForTown(town); } }
方案2:循环时过滤城镇(仅适用极小数据量)
如果城镇数量非常少,不想做预处理,可以在遍历到每个国家时,过滤出属于当前国家的城镇再生成行,缺点是数据量大时性能会明显下降。
for (Country country : countryList) { // 生成当前国家的所有城市行 for (City city : country.getCityList()) { generateRow(country, city); } // 过滤出当前国家的城镇再生成行 for (Town town : townList()) { if (country.equals(town.getCountry())) { generateRowForTown(town); } } }
方案优势
- 完全符合你要求的报表格式:同一国家的所有城市行在前,城镇行在后,不同国家的数据不混杂
- 推荐的预处理方案时间复杂度仅为O(M+N)(M为城镇总数,N为城市总数),性能最优
- 逻辑拆分清晰,后续维护调整成本低
内容的提问来源于stack exchange,提问作者user16409822
相关产品推荐
相关产品推荐

