Java初学者项目实战:创建一个简单的投票系统

初学者应先用ArrayList和控制台实现投票核心逻辑,避免过早引入Spring Boot或数据库;用Scanner配合hasNextLine()和trim()处理输入,HashMap统计票数并用merge()安全累加,封装为VotingSystem类管理状态,重点测试空输入、无效候选人等边界情况。

Java初学者做投票系统,别一上来就搞 Spring Boot 或数据库持久化——先用 ArrayList 和控制台交互把核心逻辑跑通,否则连「谁投了谁」「票数怎么算」都容易写错。

Scanner 实现基础用户输入循环

控制台投票系统的第一道坎是「不停接收输入直到用户说停」。很多人直接写 while(true) 然后靠 break 跳出,结果忘了清空输入缓冲区,导致下一次 nextLine() 读到空字符串。

  • scanner.hasNextLine() 判断输入是否有效,而不是死循环硬等
  • 每次读完 nextLine() 后,确保后续输入不会被残留换行符干扰
  • 把「输入候选人名」「输入投票人名」「输入 quit 退出」统一走同一套校验逻辑
Scanner scanner = new Scanner(System.in);
String input;
while (!(input = scanner.nextLine().trim()).equalsIgnoreCase("quit")) {
    if (!input.isEmpty()) {
        handleVote(input); // 自定义处理逻辑
    }
}

HashMap 统计票数比数组更安全

新手常犯的错:用 String[] candidates = {"A", "B", "C"}; 配合 int[] votes = new int[3];,然后靠下标匹配。一旦输错名字(比如输成 "a"" A "),程序就崩或静默丢票。

  • HashMap 允许用任意字符串作键,自动忽略顺序,也方便后期加新候选人
  • 插入前统一 trim().toLowerCase(),避免大小写和空格干扰
  • map.merge(candidate, 1, Integer::sum) 一行完成「不存在则设为1,存在则+1」
Map voteCount = new HashMap<>();
String candidate = input.trim().toLowerCase();
voteCount.merge(candidate, 1, Integer::sum);

避免在 main 方法里堆砌全部逻辑

很多初学者把候选人初始化、投票解析、结果显示全塞进 main,结果改个输出格式就得翻 50 行代码找 System.out.println

  • 把投票行为封装成 VotingSystem 类,含 addCandidate()castVote(String)printResults()
  • main 只负责创建实例、调用方法、处理 Scanner 输入流
  • 所有状态(候选人列表、票数映射)都作为类成员变量,不

    裸露在方法参数里来回传

测试边界情况比写功能更重要

初学者最容易忽略的是空输入、重复投票、投给不存在候选人这三类问题。不提前验证,后期加功能时会反复踩坑。

  • 投给不存在的候选人:检查 voteCount.containsKey(candidate),不满足就提示「候选人不存在」,不计入票数
  • 空输入或纯空格:input.trim().isEmpty() 必须拦截,否则 merge 会存入空字符串键
  • 区分「投票人」和「候选人」:当前版本可不存投票人信息,但代码里要有明确命名(如 voterName vs candidateName),避免混淆

真正卡住初学者的,从来不是「怎么写 for 循环」,而是「输入一个回车后程序卡住不动」或者「显示票数全是 0」——这些问题几乎都出在输入处理和键标准化上,多打两行 System.out.println("DEBUG: " + candidate) 比重写逻辑管用得多。