如何将新冠疫情数据存入Map<String, Map<LocalDate, List>>嵌套结构
你现有代码的核心问题有两点:
- 所有国家共用了同一个
innerMap实例,这就导致任意一个国家的日期数据修改都会同步影响所有国家,最终所有国家的内容完全一致 - 仅完成了Map结构的初始化,没有把
covidConfirmedList里的实际确诊数值填充到对应位置
正确实现方案
首先需要先处理表头提取日期序列,再逐行处理每个国家的数据,每一行单独生成对应国家的日期Map,参考实现如下:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.IntStream; public class CovidDataProcessor { public static void main(String[] args) { // 你的输入数据 covidConfirmedList 填充逻辑保持不变 List<List<String>> covidConfirmedList = new ArrayList<>(); // 定义日期格式转换器,匹配输入中的 M/d/yy 格式 DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("M/d/yy"); Map<String, Map<LocalDate, List<Integer>>> dataMap = new LinkedHashMap<>(); // 第一步:提取表头的日期列表,前4列是省、国家、纬度、经度,从索引4开始是日期 List<String> header = covidConfirmedList.get(0); List<LocalDate> dateList = IntStream.range(4, header.size()) .mapToObj(i -> LocalDate.parse(header.get(i).trim(), dateFormatter)) .toList(); // 第二步:从第二行开始遍历每个国家的数据 IntStream.range(1, covidConfirmedList.size()) .forEach(rowIdx -> { List<String> row = covidConfirmedList.get(rowIdx); // 提取国家名,索引1的位置是国家/地区字段 String country = row.get(1).trim(); // 每个国家单独创建内部Map,禁止多国家共用同一个Map实例 Map<LocalDate, List<Integer>> countryDateMap = new LinkedHashMap<>(); // 遍历日期填充对应单日确诊数值 IntStream.range(0, dateList.size()) .forEach(dateIdx -> { LocalDate date = dateList.get(dateIdx); // 日期对应的数值在当前行的 4+dateIdx 位置,转为Integer类型 Integer confirmedNum = Integer.parseInt(row.get(4 + dateIdx).trim()); // 按需求存储为单元素List countryDateMap.put(date, Collections.singletonList(confirmedNum)); }); // 把当前国家的日期数据存入总Map dataMap.put(country, countryDateMap); }); // 输出验证,结果和你给出的预期完全一致 dataMap.forEach((country, dateMap) -> { System.out.println(country + " --> " + dateMap); }); } }
内容的提问来源于stack exchange,提问作者mike kong
相关产品推荐
相关产品推荐

