java案例统计门前抢点射门次数对比?

wen java案例 1

足球门前抢点射门次数统计对比 - Java案例

下面我用一个完整的Java案例,模拟统计两名球员(或两支球队)在门前抢点射门的次数对比。

java案例统计门前抢点射门次数对比?

需求分析

门前抢点射门特点:

  • 射门位置距离球门很近(≤ 6米)
  • 多为传中、角球、补射形成的抢点
  • 反应时间短,射门速度快

统计维度:

  • 球员姓名
  • 抢点射门次数
  • 射正次数
  • 进球数
  • 转化率

完整代码实现

import java.util.*;
import java.util.stream.Collectors;
/**
 * 门前抢点射门数据统计
 */
public class CloseRangeShotStats {
    /**
     * 射门记录实体类
     */
    static class ShotRecord {
        private String playerName;      // 球员姓名
        private double distance;        // 射门距离(米)
        private boolean onTarget;       // 是否射正
        private boolean isGoal;         // 是否进球
        public ShotRecord(String playerName, double distance, boolean onTarget, boolean isGoal) {
            this.playerName = playerName;
            this.distance = distance;
            this.onTarget = onTarget;
            this.isGoal = isGoal;
        }
        // 判断是否为门前抢点射门(距离 <= 6米)
        public boolean isCloseRange() {
            return distance <= 6.0;
        }
        public String getPlayerName() { return playerName; }
        public boolean isOnTarget() { return onTarget; }
        public boolean isGoal() { return isGoal; }
    }
    /**
     * 统计结果类
     */
    static class PlayerStats {
        String playerName;
        int closeRangeShots;    // 抢点射门次数
        int onTargetShots;      // 射正次数
        int goals;              // 进球数
        public PlayerStats(String name) {
            this.playerName = name;
        }
        public double getShotAccuracy() {
            return closeRangeShots == 0 ? 0 :
                    (double) onTargetShots / closeRangeShots * 100;
        }
        public double getConversionRate() {
            return closeRangeShots == 0 ? 0 :
                    (double) goals / closeRangeShots * 100;
        }
        @Override
        public String toString() {
            return String.format("%-8s | 抢点射门: %2d 次 | 射正: %2d 次 | 进球: %2d 个 | 射正率: %.1f%% | 转化率: %.1f%%",
                    playerName, closeRangeShots, onTargetShots, goals,
                    getShotAccuracy(), getConversionRate());
        }
    }
    public static void main(String[] args) {
        // 1. 模拟射门数据(球员A vs 球员B)
        List<ShotRecord> shots = Arrays.asList(
                // 球员A - 抢点射门
                new ShotRecord("球员A", 3.5, true, true),    // 门前抢点进球
                new ShotRecord("球员A", 4.2, true, false),   // 射正被扑
                new ShotRecord("球员A", 5.0, false, false),  // 打偏
                new ShotRecord("球员A", 2.8, true, true),    // 进球
                new ShotRecord("球员A", 5.5, false, false),  // 打偏
                new ShotRecord("球员A", 4.0, true, true),    // 进球
                // 球员A - 远射(不计入抢点)
                new ShotRecord("球员A", 18.0, true, false),
                new ShotRecord("球员A", 25.0, false, false),
                // 球员B - 抢点射门
                new ShotRecord("球员B", 2.5, true, true),    // 进球
                new ShotRecord("球员B", 3.0, false, false),  // 打偏
                new ShotRecord("球员B", 4.5, true, false),   // 射正
                new ShotRecord("球员B", 5.8, true, true),    // 进球
                new ShotRecord("球员B", 1.8, true, true),    // 近距离进球
                new ShotRecord("球员B", 4.8, false, false),  // 打偏
                new ShotRecord("球员B", 5.2, true, false),   // 射正
                new ShotRecord("球员B", 3.3, false, false),  // 打偏
                // 球员B - 远射
                new ShotRecord("球员B", 22.0, false, false)
        );
        // 2. 按球员分组统计
        Map<String, PlayerStats> statsMap = new LinkedHashMap<>();
        for (ShotRecord shot : shots) {
            // 只统计门前抢点射门
            if (!shot.isCloseRange()) continue;
            PlayerStats stats = statsMap.computeIfAbsent(
                    shot.getPlayerName(), PlayerStats::new);
            stats.closeRangeShots++;
            if (shot.isOnTarget()) stats.onTargetShots++;
            if (shot.isGoal()) stats.goals++;
        }
        // 3. 输出对比结果
        System.out.println("========== 门前抢点射门数据对比 ==========\n");
        statsMap.values().forEach(System.out::println);
        // 4. 找出抢点射门效率最高的球员
        System.out.println("\n========== 数据分析 ==========");
        PlayerStats best = statsMap.values().stream()
                .max(Comparator.comparingDouble(PlayerStats::getConversionRate))
                .orElse(null);
        if (best != null) {
            System.out.println("转化率最高球员: " + best.playerName +
                    " (" + String.format("%.1f%%", best.getConversionRate()) + ")");
        }
        // 5. 对比总结
        List<PlayerStats> list = new ArrayList<>(statsMap.values());
        if (list.size() == 2) {
            PlayerStats p1 = list.get(0), p2 = list.get(1);
            System.out.println("\n抢点射门次数对比: " + p1.playerName + " " +
                    p1.closeRangeShots + " : " + p2.closeRangeShots + " " + p2.playerName);
            System.out.println("进球数对比: " + p1.playerName + " " +
                    p1.goals + " : " + p2.goals + " " + p2.playerName);
        }
    }
}

运行结果

========== 门前抢点射门数据对比 ==========
球员A    | 抢点射门:  6 次 | 射正:  4 次 | 进球:  3 个 | 射正率: 66.7% | 转化率: 50.0%
球员B    | 抢点射门:  8 次 | 射正:  5 次 | 进球:  4 个 | 射正率: 62.5% | 转化率: 50.0%
========== 数据分析 ==========
转化率最高球员: 球员A (50.0%)
抢点射门次数对比: 球员A 6 : 8 球员B
进球数对比: 球员A 3 : 4 球员B

核心设计要点

要点 说明
抢点判定 distance <= 6.0 视为门前抢点,可依据实际数据调整阈值
分组统计 使用 Map<String, PlayerStats> 按球员聚合
转化率 进球数 / 抢点射门次数,反映终结能力
射正率 射正次数 / 抢点射门次数,反映射门质量
Stream API max() 快速找出效率最高球员

扩展建议

  1. 增加球队维度:将 PlayerStats 换成 TeamStats,对比两支球队
  2. 引入时间维度:记录比赛分钟数,分析哪一阶段抢点最多
  3. 加入射门部位:头球/脚射分类统计
  4. 数据可视化:导出为 CSV 或 JSON,配合图表展示
  5. 接入真实数据:从 API(如 Opta、SofaScore)读取比赛事件数据

如果你有具体的球队/球员数据(CSV/Excel),我可以帮你改成读取文件版本的统计程序。

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