Java实现:用户输入CSV地址,按州分组城市并统计地址数
解决CSV地址数据的州-城市数量统计问题
需求说明
- 输入:每行符合
area,city,state,pincode格式的CSV地址数据 - 数据结构:采用
Map<String, Map<String, Integer>>,外层键为州名,内层键为城市名,值为该城市的地址统计数量 - 输出:先打印州名,再依次列出该州下所有城市及对应的地址数量
修正后的完整实现代码
import java.util.*; public class AddressCounter { public static void main(String[] args) { // 初始化嵌套Map:州名 -> (城市名 -> 地址数量) Map<String, Map<String, Integer>> stateCityStats = new HashMap<>(); Scanner inputScanner = new Scanner(System.in); System.out.println("请输入CSV格式地址(每行1条,输入空行结束):"); String inputLine; while (!(inputLine = inputScanner.nextLine()).isEmpty()) { // 分割行数据并去除首尾空格,兼容带空格的输入 String[] addressParts = inputLine.trim().split(","); if (addressParts.length != 4) { System.out.println("格式错误,请输入area,city,state,pincode格式内容"); continue; } String city = addressParts[1].trim(); String state = addressParts[2].trim(); // 自动初始化州对应的城市Map,避免空指针 stateCityStats.computeIfAbsent(state, k -> new HashMap<>()) .put(city, stateCityStats.get(state).getOrDefault(city, 0) + 1); } inputScanner.close(); // 按要求输出统计结果 System.out.println("\n统计结果:"); for (Map.Entry<String, Map<String, Integer>> stateEntry : stateCityStats.entrySet()) { System.out.println("州:" + stateEntry.getKey()); Map<String, Integer> cityCounts = stateEntry.getValue(); for (Map.Entry<String, Integer> cityEntry : cityCounts.entrySet()) { System.out.println(" 城市:" + cityEntry.getKey() + ",地址数量:" + cityEntry.getValue()); } } } }
关键修正点说明
- 嵌套Map初始化:使用
computeIfAbsent方法,当州名首次出现时自动创建对应的城市统计Map,避免手动判空导致的空指针异常 - 数据清洗:对输入行和分割后的字段做
trim()处理,兼容用户输入时带空格的情况 - 数量累加逻辑:用
getOrDefault处理城市首次出现的场景,确保从0开始累加 - 输入校验:判断分割后的字段数量是否为4,过滤无效输入
内容的提问来源于stack exchange,提问作者Gudu
相关产品推荐
相关产品推荐

