Java读取双CSV匹配州名与缩写赋值给CityCrime对象问题
完整实现方案
1. 执行顺序调整
必须先加载州名缩写映射表,再读取犯罪数据:只需要调用1次readAbbrevData()拿到HashMap<String,String> stateToAbbreviation对象即可,不要放在读取犯罪数据的行循环里重复调用,避免不必要的性能损耗。
2. 核心匹配逻辑修改
你原来readCrimeData()方法中注释掉的crime.setState(stats[1])位置,替换为以下匹配逻辑即可,假设你读取crimeUSA.csv每行拆分后,stats[1]对应原始州名字段:
// 提前在循环外加载好映射表 HashMap<String, String> stateToAbbreviation = readAbbrevData(); // 逐行读取crimeUSA.csv的循环内逻辑 CityCrime crime = new CityCrime(); // 原有其他属性赋值逻辑保留,比如城市、人口等 crime.setCity(stats[2]); crime.setPopulation(Integer.parseInt(stats[3])); // 州名匹配赋值逻辑 String rawState = stats[1].trim(); // 去除原始值前后空格,避免格式问题导致匹配失败 String targetAbbrev = stateToAbbreviation.get(rawState); // 容错处理:避免匹配不到时报空指针 if (targetAbbrev == null) { // 可以自定义兜底逻辑,比如打印异常信息方便排查 System.out.println("未匹配到对应州缩写,原始州名:" + rawState); targetAbbrev = rawState; // 兜底直接使用原始州名,避免属性为空 } // 给对象属性赋值 crime.setState(targetAbbrev); // 直接把缩写赋值给state属性,符合你的需求 // 如果需要单独存储完整州名和缩写两个字段,就额外调用setAbbreviation // crime.setAbbreviation(targetAbbrev);
3. 常见问题优化(新手必看)
如果出现匹配失败的情况,90%是因为州名字符串格式不一致导致的,可以统一格式规避:
- 加载映射表的时候,就把key统一转成全大写/全小写后再存,示例(修改你的
readAbbrevData()方法):// 读取StatesAbbreviations.csv每行存映射时的逻辑 String fullStateName = 读到的states字段值.trim().toUpperCase(); String abbrev = 读到的abbrev字段值.trim(); stateToAbbreviation.put(fullStateName, abbrev); - 匹配的时候也把原始州名转成同样的格式:
String targetAbbrev = stateToAbbreviation.get(rawState.toUpperCase());
内容的提问来源于stack exchange,提问作者e102
相关产品推荐
相关产品推荐

