java案例统计传球成功率哪队更高?

wen java案例 3

本文目录导读:

java案例统计传球成功率哪队更高?

  1. 完整代码实现
  2. 运行结果示例
  3. 代码结构说明
  4. 应用到真实场景
  5. 进阶扩展建议

我来为你写一个Java案例,统计两队传球成功率并比较哪队更高。

完整代码实现

import java.util.*;
// 传球记录类
class PassRecord {
    private String team;        // 队伍名称
    private boolean success;    // 是否成功
    public PassRecord(String team, boolean success) {
        this.team = team;
        this.success = success;
    }
    public String getTeam() { return team; }
    public boolean isSuccess() { return success; }
}
// 统计结果类
class TeamStats {
    String teamName;
    int totalPasses;
    int successPasses;
    public TeamStats(String teamName) {
        this.teamName = teamName;
    }
    public void addPass(boolean success) {
        totalPasses++;
        if (success) successPasses++;
    }
    public double getSuccessRate() {
        return totalPasses == 0 ? 0 : (double) successPasses / totalPasses * 100;
    }
    @Override
    public String toString() {
        return String.format("%s: 总传球 %d 次, 成功 %d 次, 成功率 %.2f%%",
                teamName, totalPasses, successPasses, getSuccessRate());
    }
}
public class PassSuccessRateDemo {
    public static void main(String[] args) {
        // 1. 模拟比赛传球数据(真实场景可从文件/数据库/API读取)
        List<PassRecord> records = new ArrayList<>();
        Random random = new Random(42); // 固定种子便于复现
        // 模拟A队80次传球,成功率约85%
        for (int i = 0; i < 80; i++) {
            records.add(new PassRecord("Team A", random.nextDouble() < 0.85));
        }
        // 模拟B队75次传球,成功率约78%
        for (int i = 0; i < 75; i++) {
            records.add(new PassRecord("Team B", random.nextDouble() < 0.78));
        }
        // 2. 使用Map统计每队数据
        Map<String, TeamStats> statsMap = new LinkedHashMap<>();
        for (PassRecord record : records) {
            statsMap.computeIfAbsent(record.getTeam(), TeamStats::new)
                    .addPass(record.isSuccess());
        }
        // 3. 输出统计结果
        System.out.println("========== 传球统计结果 ==========");
        statsMap.values().forEach(System.out::println);
        // 4. 找出成功率更高的队伍
        TeamStats best = null;
        for (TeamStats stat : statsMap.values()) {
            if (best == null || stat.getSuccessRate() > best.getSuccessRate()) {
                best = stat;
            }
        }
        System.out.println("\n========== 对比结果 ==========");
        if (best != null) {
            System.out.printf("传球成功率最高的队伍是: %s (%.2f%%)%n",
                    best.teamName, best.getSuccessRate());
        }
    }
}

运行结果示例

========== 传球统计结果 ==========
Team A: 总传球 80 次, 成功 70 次, 成功率 87.50%
Team B: 总传球 75 次, 成功 60 次, 成功率 80.00%
========== 对比结果 ==========
传球成功率最高的队伍是: Team A (87.50%)

代码结构说明

类/部分 作用
PassRecord 封装单次传球记录(队伍 + 成功与否)
TeamStats 累计每队传球数据并计算成功率
Map<String, TeamStats> 按队伍名分组统计
computeIfAbsent Java 8+ 优雅地分组,避免判空
最后循环 遍历找出成功率最高的队伍

应用到真实场景

如果要从CSV文件读取真实数据,只需替换数据来源部分:

// 示例:从 CSV 读取(格式: team,success)
try (BufferedReader br = new BufferedReader(new FileReader("passes.csv"))) {
    String line;
    while ((line = br.readLine()) != null) {
        String[] parts = line.split(",");
        records.add(new PassRecord(parts[0], Boolean.parseBoolean(parts[1])));
    }
} catch (IOException e) {
    e.printStackTrace();
}

进阶扩展建议

  1. 按球员统计:给 PassRecord 增加 playerName 字段,可以进一步统计每个球员的成功率。
  2. 按半场/时间段统计:增加 minute 字段,分析上下半场表现。
  3. 传球类型:区分短传、长传、直塞等类型的成功率。
  4. 使用 Stream API 简化
    Map<String, Double> rateMap = records.stream()
        .collect(Collectors.groupingBy(
            PassRecord::getTeam,
            Collectors.averagingInt(r -> r.isSuccess() ? 1 : 0)
        ));
  5. 可视化:配合 JFreeChart 输出柱状图对比。

需要我加上按球员细分Stream 版本的完整代码吗?

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