Java-day20-4
一、项目需求分析
设计一个投票统计系统,支持多人投票并统计结果,核心需求如下:
-
使用 HashMap 存储候选人姓名(键)与得票数(值);
-
支持多次投票,通过控制台输入候选人姓名(支持自定义候选人,无需预先指定);
-
投票结束后,输出所有候选人的得票情况;
-
找出并输出得票最高的候选人(若有并列第一,需全部列出)。
**技术选型**:
-
存储容器: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 最值查找逻辑(处理并列情况)
-
第一次遍历 voteMap.values(),找出最高得票数 maxVotes;
-
第二次遍历 voteMap.entrySet(),收集所有得票数等于 maxVotes 的候选人姓名;
-
根据收集到的候选人数量,判断是单独冠军还是并列冠军,分别输出。
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); // 记录投票人
// 再输入候选人姓名进行投票...
```
六、总结:项目实战要点
-
**HashMap 应用场景**:完美适配"键值映射统计"需求,候选人姓名作为唯一键,得票数作为值,更新与查询效率高;
-
**核心逻辑**:投票时通过 containsKey() 判断候选人是否存在,动态更新票数;统计时通过两次遍历找出最高得票者,处理并列情况;
-
**用户体验**:添加结束投票指令、输入校验、格式优化,让系统更易用;
-
**扩展性**:可灵活扩展投票次数限制、重复投票限制、候选人预先指定等功能。
本项目是 HashMap 集合在"统计类场景"的典型应用,覆盖了键值对的新增、更新、遍历、最值查找等核心操作。通过实际运行,可深入理解 HashMap 在动态统计场景中的优势,为后续开发类似系统(如问卷统计、评选活动)提供参考。