这个java案例显示被射门次数对比?

wen java案例 2

Java 实现"被射门次数对比"案例

下面给你一个完整的 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)
逻辑判断 最大值/最小值比较

可扩展方向

  1. 读取真实数据:从 CSV / JSON 文件用 BufferedReader 读入
  2. 加入射门转化率:被射门 ÷ 被进球,分析门将表现
  3. 多队对比:改成 Map<String, List<Integer>>
  4. 图表输出:引入 JFreeChart 画折线/柱状图
  5. Spring Boot 接口版:返回 JSON 给前端渲染 ECharts

如果你需要 CSV/JSON 版本,或者 对接前端图表的版本,我可以直接帮你写,要哪种?

抱歉,评论功能暂时关闭!