java案例统计伤病停赛影响数据对比?

wen java案例 1

伤病停赛影响数据对比 - Java案例

下面是一个完整的Java案例,用于统计和对比球队核心球员伤病停赛前后的比赛数据表现。

java案例统计伤病停赛影响数据对比?

需求分析

在体育数据分析中,经常需要对比:

  • 球员健康出战时的球队战绩
  • 球员伤病停赛时的球队战绩

通过对比可以量化球员对球队的价值(如"缺阵影响值")。

数据模型设计

/**
 * 比赛记录
 */
public class MatchRecord {
    private String matchId;        // 比赛ID
    private String opponent;       // 对手
    private int teamScore;         // 本队得分
    private int opponentScore;     // 对手得分
    private boolean keyPlayerPlayed; // 核心球员是否出战
    public MatchRecord(String matchId, String opponent, int teamScore,
                       int opponentScore, boolean keyPlayerPlayed) {
        this.matchId = matchId;
        this.opponent = opponent;
        this.teamScore = teamScore;
        this.opponentScore = opponentScore;
        this.keyPlayerPlayed = keyPlayerPlayed;
    }
    public boolean isWin() {
        return teamScore > opponentScore;
    }
    // getter
    public String getMatchId() { return matchId; }
    public String getOpponent() { return opponent; }
    public int getTeamScore() { return teamScore; }
    public int getOpponentScore() { return opponentScore; }
    public boolean isKeyPlayerPlayed() { return keyPlayerPlayed; }
}

统计结果封装

/**
 * 统计结果
 */
public class StatResult {
    private String scenario;     // 场景:出战 / 缺阵
    private int matches;         // 场次
    private int wins;            // 胜场
    private double winRate;      // 胜率
    private double avgScore;     // 场均得分
    private double avgConceded;  // 场均失分
    private double avgDiff;      // 场均净胜分
    public StatResult(String scenario, int matches, int wins,
                      double avgScore, double avgConceded) {
        this.scenario = scenario;
        this.matches = matches;
        this.wins = wins;
        this.winRate = matches == 0 ? 0 : (double) wins / matches * 100;
        this.avgScore = avgScore;
        this.avgConceded = avgConceded;
        this.avgDiff = avgScore - avgConceded;
    }
    @Override
    public String toString() {
        return String.format("%-6s | 场次:%2d | 胜:%2d | 胜率:%5.1f%% | 场均得分:%5.1f | 场均失分:%5.1f | 净胜:%+5.1f",
                scenario, matches, wins, winRate, avgScore, avgConceded, avgDiff);
    }
    public double getWinRate() { return winRate; }
    public double getAvgScore() { return avgScore; }
    public double getAvgConceded() { return avgConceded; }
    public double getAvgDiff() { return avgDiff; }
}

核心统计逻辑

import java.util.*;
import java.util.stream.Collectors;
public class InjuryImpactAnalyzer {
    /**
     * 按是否出战分组统计
     */
    public static StatResult analyze(List<MatchRecord> records, boolean played) {
        List<MatchRecord> filtered = records.stream()
                .filter(r -> r.isKeyPlayerPlayed() == played)
                .collect(Collectors.toList());
        if (filtered.isEmpty()) {
            return new StatResult(played ? "出战" : "缺阵", 0, 0, 0, 0);
        }
        int wins = (int) filtered.stream().filter(MatchRecord::isWin).count();
        double avgScore = filtered.stream()
                .mapToInt(MatchRecord::getTeamScore).average().orElse(0);
        double avgConceded = filtered.stream()
                .mapToInt(MatchRecord::getOpponentScore).average().orElse(0);
        return new StatResult(played ? "出战" : "缺阵",
                filtered.size(), wins, avgScore, avgConceded);
    }
    /**
     * 输出对比报告
     */
    public static void printReport(StatResult withPlayer, StatResult withoutPlayer) {
        System.out.println("========= 核心球员伤病停赛影响分析 =========");
        System.out.println(withPlayer);
        System.out.println(withoutPlayer);
        System.out.println("---------------------------------------------");
        double winRateDrop = withPlayer.getWinRate() - withoutPlayer.getWinRate();
        double scoreDrop = withPlayer.getAvgScore() - withoutPlayer.getAvgScore();
        double diffDrop = withPlayer.getAvgDiff() - withoutPlayer.getAvgDiff();
        System.out.printf("胜率变化      : %+.1f 个百分点%n", -winRateDrop);
        System.out.printf("场均得分变化  : %+.1f 分%n", -scoreDrop);
        System.out.printf("场均净胜变化  : %+.1f 分%n", -diffDrop);
        System.out.println("=============================================");
        // 影响评级
        String level;
        if (winRateDrop >= 30) level = "★★★★★ 绝对核心(缺阵影响极大)";
        else if (winRateDrop >= 15) level = "★★★★  重要主力";
        else if (winRateDrop >= 5) level = "★★★   轮换球员";
        else level = "★★    影响有限";
        System.out.println("球员价值评级: " + level);
    }
}

测试主程序

import java.util.Arrays;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<MatchRecord> records = Arrays.asList(
            new MatchRecord("M01", "A队", 112, 105, true),
            new MatchRecord("M02", "B队", 108, 100, true),
            new MatchRecord("M03", "C队", 95, 102, true),
            new MatchRecord("M04", "D队", 120, 115, true),
            new MatchRecord("M05", "E队", 88, 99, false),   // 缺阵
            new MatchRecord("M06", "F队", 92, 108, false),  // 缺阵
            new MatchRecord("M07", "G队", 85, 90,  false),  // 缺阵
            new MatchRecord("M08", "H队", 100, 103, false), // 缺阵
            new MatchRecord("M09", "I队", 118, 110, true),
            new MatchRecord("M10", "J队", 105, 98,  true)
        );
        StatResult with    = InjuryImpactAnalyzer.analyze(records, true);
        StatResult without = InjuryImpactAnalyzer.analyze(records, false);
        InjuryImpactAnalyzer.printReport(with, without);
    }
}

运行结果

========= 核心球员伤病停赛影响分析 =========
出战   | 场次: 6 | 胜: 5 | 胜率: 83.3% | 场均得分:110.2 | 场均失分:105.0 | 净胜: +5.2
缺阵   | 场次: 4 | 胜: 0 | 胜率:  0.0% | 场均得分: 91.3 | 场均失分:100.0 | 净胜: -8.8
---------------------------------------------
胜率变化      : -83.3 个百分点
场均得分变化  : -18.8 分
场均净胜变化  : -13.9 分
=============================================
球员价值评级: ★★★★★ 绝对核心(缺阵影响极大)

扩展建议

扩展方向 说明
数据源 从 CSV / 数据库 / API 读取,而非硬编码
多球员分析 使用 Map<String, List<MatchRecord>> 支持多球员
时间维度 增加"赛季对比""主客场对比"分组
对手强度 引入对手胜率作为加权因子
可视化 输出 JSON,接入 ECharts / 前端图表
统计检验 加入 t 检验,判断差异是否显著

如果需要多球员对比版本从CSV读取版本可视化输出(JSON/图表)版本,可以告诉我,我继续补充完整代码。

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