使用HashMap统计投票结果时,键必须不可变且正确重写equals和hashCode;Scanner输入需处理nextInt()残留换行符;排序应转为List后按值降序;所有输入须校验并异常捕获。

用 HashMap 统计投票结果时,键值类型选错会直接抛 NullPointerException
常见错误是把候选人姓名(String)当键,但用 new String("张三") 多次创建不同对象作键,或误用可变对象(比如自定义的 Candidate 类却没重写 equals 和 hashCode),导致重复投票被算成多个键。
正确做法:键必须是不可变且语义相等即逻辑相等的对象。对人名,直接用字面量或规范后的 String 即可;若封装为对象,务必重写 equals 和 hashCode,且字段全部 final。
控制台输入候选人数和票数时,Scanner 的 nextLine() 被 nextInt() 留下的换行符干扰
典型现象:输入完候选人总数后,第一个候选人名字直接“跳过”,程序读到空字符串。这是因为 nextInt() 不消费换行符,紧接着的 nextLine() 立刻读到这个残留的 \n。
- 统一用
nextLine()读所有输入,再用Integer.parseInt()转数字 - 或者在每次
nextInt()后手动加一句scanner.nextLine();清掉缓冲区 - 避免混用
next()和nextLine()—— 前者不读空格后内容,后者读整行,行为差异极易引发漏读
统计完成后按得票数降序输出,别直接对 HashMap 排序
HashMap 本身无序,也不能直接排序。常见错误是试图调用 map.sort(...)(根本不存在)或用 TreeMap 按键排序(但你要的是按值排序)。
Map<String, Integer> votes = new HashMap<>();
// ... 投票录入
List<Map.Entry<String, Integer>> sorted = votes.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.collect(Collectors.toList());
for (Map.Entry<String, Integer> entry : sorted) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
注意:Java 8+ 才支持这种流式写法;若用低版本,需把 entrySet() 转成 List 后用 Collections.sort() 配合自定义 Comparator。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
控制台交互中没处理非法输入,导致程序崩溃或逻辑错乱
用户可能输非数字票数、空姓名、负数、甚至直接回车。这些都会让 parseInt 抛 NumberFormatException,或使 put 存入 null 键/值,后续遍历时出问题。
- 所有数字输入必须用
try-catch包裹Integer.parseInt() - 姓名输入后要
trim().isEmpty()判空,拒绝空白票 - 投票环节建议用循环 +
break控制,直到输入合法值才继续,而不是“一次失败就退出” - 考虑加一个 “输入
quit退出投票” 的快捷路径,提升可用性
真正难的不是写完功能,而是让每一步输入都有兜底——尤其控制台程序没人帮你点重试按钮。

















