对CityCrime类型ArrayList排序并按州累加机动车盗窃数的实现求助
州维度机动车盗窃数统计实现方案
前置说明
假设你的CityCrime类已经实现了两个取值方法:
getState():返回对应城市所属州的缩写字符串getMotorTheft():返回对应城市的机动车盗窃数值(int类型)
所有实现基于你已经读取完成的公共静态变量ArrayList<CityCrime> crimes编写。
实现步骤
1. 按州分组累加总盗窃数
使用HashMap做分组统计,代码如下:
// 初始化存储映射:key为州名,value为对应州总机动车盗窃数 Map<String, Integer> stateTheftSum = new HashMap<>(); for (CityCrime cityData : crimes) { String state = cityData.getState(); int currentTheft = cityData.getMotorTheft(); // 累加逻辑:州已存在则叠加当前值,不存在则初始化为当前值 stateTheftSum.put(state, stateTheftSum.getOrDefault(state, 0) + currentTheft); }
JDK8及以上版本也可以用Stream简化写法:
Map<String, Integer> stateTheftSum = crimes.stream() .collect(Collectors.toMap( CityCrime::getState, CityCrime::getMotorTheft, Integer::sum ));
2. 按州名字母排序并输出
// 提取所有州名并按字母升序排序 List<String> sortedStates = new ArrayList<>(stateTheftSum.keySet()); Collections.sort(sortedStates); // 按要求格式输出 for (String state : sortedStates) { System.out.println(state + " " + stateTheftSum.get(state)); }
Stream简化写法:
stateTheftSum.keySet().stream() .sorted() .forEach(state -> System.out.printf("%s %d%n", state, stateTheftSum.get(state)));
常见问题排查
如果结果不符合预期,优先检查以下几点:
- 确认
getMotorTheft()返回的是机动车盗窃字段,没有错拿其他犯罪类型的数值 - 确认州名字段没有多余空格、大小写不一致的问题,如有可以在存入map时统一处理,例如改为
state.trim().toUpperCase() - 确认
crimes列表没有重复存入数据,避免重复累加
内容的提问来源于stack exchange,提问作者e102
相关产品推荐
相关产品推荐

