Java 实战:投票统计系统(HashMap 应用)

Java-day20-4

一、项目需求分析

设计一个投票统计系统,支持多人投票并统计结果,核心需求如下:

  1. 使用 HashMap 存储候选人姓名(键)与得票数(值);

  2. 支持多次投票,通过控制台输入候选人姓名(支持自定义候选人,无需预先指定);

  3. 投票结束后,输出所有候选人的得票情况;

  4. 找出并输出得票最高的候选人(若有并列第一,需全部列出)。

**技术选型**:

  • 存储容器:HashMap(键唯一存候选人,值存票数,支持高效更新与查询);

  • 交互方式:控制台输入输出(Scanner 类);

  • 核心技术:HashMap 的 put()、get()、containsKey() 方法,遍历统计逻辑,最值查找。

二、项目实现步骤

2.1 完整实现代码

```java

java 复制代码
import java.util.ArrayList;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

/**

* 投票统计系统:使用HashMap统计候选人得票数,找出得票最高者

*/

public class VoteSystem {

public static void main(String[] args) {

// 1. 初始化HashMap:存储候选人姓名-得票数映射

HashMap voteMap = new HashMap<>();

Scanner scanner = new Scanner(System.in);

String input;

System.out.println("======= 投票统计系统 =======");

System.out.println("请输入候选人姓名进行投票(输入 'exit' 结束投票):");

// 2. 循环接收投票(输入 exit 终止)

while (true) {

System.out.print("请输入候选人姓名:");

input = scanner.nextLine().trim(); // 去除首尾空格

// 结束投票条件

if ("exit".equalsIgnoreCase(input)) {

break;

}

// 验证输入不为空

if (input.isEmpty()) {

System.out.println("输入不能为空,请重新输入!");

continue;

}

// 3. 更新候选人得票数

if (voteMap.containsKey(input)) {

// 候选人已存在,得票数+1

int count = voteMap.get(input);

voteMap.put(input, count + 1);

} else {

// 候选人不存在,初始化得票数为1

voteMap.put(input, 1);

}

System.out.println("投票成功!当前 " + input + " 得票数:" + voteMap.get(input));

}

// 4. 投票结束,输出统计结果

System.out.println("\n======= 投票统计结果 =======");

if (voteMap.isEmpty()) {

System.out.println("未收到任何投票!");

scanner.close();

return;

}

// 输出所有候选人得票情况

for (Map.Entry entry : voteMap.entrySet()) {

System.out.println(entry.getKey() + ":" + entry.getValue() + " 票");

}

// 5. 找出得票最高的候选人

int maxVotes = 0;

ArrayList topCandidates = new ArrayList<>();

// 第一步:找出最高得票数

for (int votes : voteMap.values()) {

if (votes > maxVotes) {

maxVotes = votes;

}

}

// 第二步:收集所有得票最高的候选人(处理并列情况)

for (Map.Entry entry : voteMap.entrySet()) {

if (entry.getValue() == maxVotes) {

topCandidates.add(entry.getKey());

}

}

// 输出得票最高的候选人

System.out.println("\n======= 得票最高的候选人 =======");

if (topCandidates.size() == 1) {

System.out.println("冠军:" + topCandidates.get(0) + ",得票数:" + maxVotes + " 票");

} else {

System.out.println("并列冠军(得票数:" + maxVotes + " 票):");

for (String candidate : topCandidates) {

System.out.println("- " + candidate);

}

}

scanner.close();

}

}

```

三、核心技术解析

3.1 HashMap 核心操作

  • **新增/更新票数**:通过 containsKey() 判断候选人是否已存在,存在则 get() 现有票数+1后 put() 更新,不存在则 put() 初始化票数为1;

  • **遍历候选人**:使用 entrySet() 遍历所有键值对,输出每个候选人的得票情况;

  • **获取票数集合**:通过 values() 方法获取所有得票数,用于查找最高得票。

3.2 最值查找逻辑(处理并列情况)

  1. 第一次遍历 voteMap.values(),找出最高得票数 maxVotes;

  2. 第二次遍历 voteMap.entrySet(),收集所有得票数等于 maxVotes 的候选人姓名;

  3. 根据收集到的候选人数量,判断是单独冠军还是并列冠军,分别输出。

3.3 控制台交互优化

  • 输入 exit(不区分大小写)结束投票,提升用户体验;

  • 使用 trim() 去除输入首尾空格,避免因误输入空格导致的重复候选人;

  • 增加输入为空的校验,防止无效投票。

四、运行效果演示

4.1 投票过程

======= 投票统计系统 =======

请输入候选人姓名进行投票(输入 'exit' 结束投票):

请输入候选人姓名:张三

投票成功!当前 张三 得票数:1

请输入候选人姓名:李四

投票成功!当前 李四 得票数:1

请输入候选人姓名:张三

投票成功!当前 张三 得票数:2

请输入候选人姓名:王五

投票成功!当前 王五 得票数:1

请输入候选人姓名:张三

投票成功!当前 张三 得票数:3

请输入候选人姓名:李四

投票成功!当前 李四 得票数:2

请输入候选人姓名:exit

4.2 统计结果输出

======= 投票统计结果 =======

张三:3 票

李四:2 票

王五:1 票

======= 得票最高的候选人 =======

冠军:张三,得票数:3 票

4.3 并列冠军场景输出

若投票结果为:张三3票、李四3票、王五2票,则输出:

======= 得票最高的候选人 =======

并列冠军(得票数:3 票):

  • 张三

  • 李四

五、扩展功能与优化

5.1 限制投票次数

若需限制总投票次数(如最多10人投票),可添加投票次数计数器:

```java

java 复制代码
int maxVoteCount = 10; // 最大投票次数

int currentCount = 0; // 当前投票次数

while (currentCount < maxVoteCount) {

System.out.print("请输入候选人姓名(剩余投票次数:" + (maxVoteCount - currentCount) + "):");

input = scanner.nextLine().trim();

if ("exit".equalsIgnoreCase(input)) {

break;

}

// 投票逻辑...

currentCount++; // 投票次数+1

}

```

5.2 禁止重复投票(按投票人姓名)

若需防止同一人重复投票,可添加投票人列表记录:

```java

java 复制代码
HashSet voterSet = new HashSet<>(); // 存储已投票人姓名

// 投票前先输入投票人姓名

System.out.print("请输入您的姓名:");

String voterName = scanner.nextLine().trim();

if (voterSet.contains(voterName)) {

System.out.println("您已投过票,不可重复投票!");

continue;

}

voterSet.add(voterName); // 记录投票人

// 再输入候选人姓名进行投票...

```

六、总结:项目实战要点

  1. **HashMap 应用场景**:完美适配"键值映射统计"需求,候选人姓名作为唯一键,得票数作为值,更新与查询效率高;

  2. **核心逻辑**:投票时通过 containsKey() 判断候选人是否存在,动态更新票数;统计时通过两次遍历找出最高得票者,处理并列情况;

  3. **用户体验**:添加结束投票指令、输入校验、格式优化,让系统更易用;

  4. **扩展性**:可灵活扩展投票次数限制、重复投票限制、候选人预先指定等功能。

本项目是 HashMap 集合在"统计类场景"的典型应用,覆盖了键值对的新增、更新、遍历、最值查找等核心操作。通过实际运行,可深入理解 HashMap 在动态统计场景中的优势,为后续开发类似系统(如问卷统计、评选活动)提供参考。

相关推荐
zzzsde2 小时前
【C++】红黑树:使用及实现
开发语言·c++·算法
q***78782 小时前
SpringBoot后端服务重定向
java·spring boot·后端
点云SLAM2 小时前
C++ 中的栈(Stack)数据结构与堆的区别与内存布局(Stack vs Heap)
开发语言·数据结构·c++·内存布局·栈数据结构·c++标准算法·heap内存分配
枫子有风2 小时前
【go.sixue.work】2.2 面向对象:接口与多态
开发语言·后端·golang·xcode
Fantasydg2 小时前
外卖项目day02
java
Kuo-Teng3 小时前
LeetCode 139: Word Break
java·算法·leetcode·职场和发展·word·动态规划
百***35513 小时前
Tomcat10下载安装教程
java
qq_401700413 小时前
QT的5种标准对话框
开发语言·qt