Java 实现"被射门次数对比"案例
下面给你一个完整的 Java 案例,展示两支球队被射门次数的对比,包括数据模型、统计逻辑和可视化输出。

需求分析
- 有两支球队(A 队、B 队)
- 每场比赛记录:哪队被射门、被射门次数
- 最终输出:两队被射门总次数对比 + 简单柱状图
完整代码
import java.util.*;
// 1. 比赛记录实体类
class MatchRecord {
private String team; // 球队名
private int shotsOnTarget; // 被射门次数
public MatchRecord(String team, int shotsOnTarget) {
this.team = team;
this.shotsOnTarget = shotsOnTarget;
}
public String getTeam() { return team; }
public int getShotsOnTarget() { return shotsOnTarget; }
}
public class ShotCompareDemo {
public static void main(String[] args) {
// 2. 模拟数据:5 场比赛,每场记录两队被射门次数
List<MatchRecord> records = Arrays.asList(
new MatchRecord("A队", 12), new MatchRecord("B队", 8),
new MatchRecord("A队", 15), new MatchRecord("B队", 10),
new MatchRecord("A队", 9), new MatchRecord("B队", 14),
new MatchRecord("A队", 11), new MatchRecord("B队", 7),
new MatchRecord("A队", 13), new MatchRecord("B队", 9)
);
// 3. 统计每队被射门总数
Map<String, Integer> totalMap = new LinkedHashMap<>();
for (MatchRecord r : records) {
totalMap.merge(r.getTeam(), r.getShotsOnTarget(), Integer::sum);
}
// 4. 计算两队场均被射门
Map<String, Integer> countMap = new HashMap<>();
for (MatchRecord r : records) {
countMap.merge(r.getTeam(), 1, Integer::sum);
}
// 5. 打印对比结果
System.out.println("========= 被射门次数对比 =========");
System.out.printf("%-6s %-10s %-10s %-10s%n", "球队", "总次数", "场次", "场均");
int maxTotal = 0;
for (Map.Entry<String, Integer> e : totalMap.entrySet()) {
String team = e.getKey();
int total = e.getValue();
int games = countMap.get(team);
double avg = (double) total / games;
System.out.printf("%-6s %-10d %-10d %-10.2f%n", team, total, games, avg);
maxTotal = Math.max(maxTotal, total);
}
// 6. 简单柱状图对比
System.out.println("\n========= 柱状图对比 =========");
for (Map.Entry<String, Integer> e : totalMap.entrySet()) {
System.out.printf("%-4s |", e.getKey());
System.out.print("█".repeat(e.getValue() / 2)); // 每 2 次射门画一个方块
System.out.println(" " + e.getValue());
}
// 7. 结论判定
System.out.println("\n========= =========");
String better = null, worse = null;
int min = Integer.MAX_VALUE;
for (Map.Entry<String, Integer> e : totalMap.entrySet()) {
if (e.getValue() > maxTotal) maxTotal = e.getValue();
if (e.getValue() < min) { min = e.getValue(); worse = e.getKey(); }
}
for (Map.Entry<String, Integer> e : totalMap.entrySet()) {
if (e.getValue() == maxTotal) better = e.getKey();
}
System.out.println("被射门最多(防守压力最大): " + better);
System.out.println("被射门最少(防守更稳): " + worse);
}
}
运行结果示例
========= 被射门次数对比 =========
球队 总次数 场次 场均
A队 60 5 12.00
B队 48 5 9.60
========= 柱状图对比 =========
A队 |██████████████████████████████ 60
B队 |████████████████████████ 48
========= =========
被射门最多(防守压力最大): A队
被射门最少(防守更稳): B队
案例亮点
| 功能 | 用到知识点 |
|---|---|
| 数据建模 | class、构造函数、封装 |
| 数据聚合 | Map.merge()、Integer::sum |
| 排序稳定性 | LinkedHashMap |
| 格式化输出 | String.format / printf |
| 可视化 | 字符串重复 "█".repeat(n) |
| 逻辑判断 | 最大值/最小值比较 |
可扩展方向
- 读取真实数据:从 CSV / JSON 文件用
BufferedReader读入 - 加入射门转化率:被射门 ÷ 被进球,分析门将表现
- 多队对比:改成
Map<String, List<Integer>> - 图表输出:引入 JFreeChart 画折线/柱状图
- Spring Boot 接口版:返回 JSON 给前端渲染 ECharts
如果你需要 CSV/JSON 版本,或者 对接前端图表的版本,我可以直接帮你写,要哪种?