使用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 按键排序(但你要的是按值排序)。
Mapvotes = new HashMap<>(); // ... 投票录入 List > sorted = votes.entrySet().stream() .sorted(Map.Entry. comparingByValue().reversed()) .collect(Collectors.toList()); for (Map.Entry entry : sorted) { System.out.println(entry.getKey() + ": " + entry.getValue()); }
注意:Java 8+ 才支持这种流式写法;若用低版本,需把 entrySet() 转成 List 后用 Collections.sort() 配合自定义 Comparator。
立即学习“Java免费学习笔记(深入)”;
控制台交互中没处理非法输入,导致程序崩溃或逻辑错乱
用户可能输非数字票数、空姓名、负数、甚至直接回车。这些都会让 parseInt 抛 NumberFormatException,或使 put 存入 null 键/值,后续遍历时出问题。
- 所有数字输入必须用
try-catch包裹Integer.parseInt() - 姓名输入后要
trim().isEmpty()判空,拒绝空白票 - 投票环节建议用循环 +
break控制,直到输入合法值才继续,而不是“一次失败就退出” - 考虑加一个 “输入
quit退出投票” 的快捷路径,提升可用性
真正难的不是写完功能,而是让每一步输入都有兜底——尤其控制台程序没人帮你点重试按钮。










