java案例统计高位逼抢夺回球权几次?

wen java案例 1

Java案例:统计高位逼抢夺回球权次数

下面是一个完整的Java案例,模拟足球比赛中高位逼抢(High Press)并统计成功夺回球权的次数。

java案例统计高位逼抢夺回球权几次?

需求分析

高位逼抢:在对方半场(通常是前场1/3区域)对持球队员施压,迫使对方失误并夺回球权。

统计逻辑:

  • 每次逼抢事件记录:位置坐标、是否成功、时间
  • 只有发生在前场区域的成功夺回,才算高位逼抢夺回

完整代码

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 高位逼抢事件
 */
class PressEvent {
    private String playerName;   // 逼抢球员
    private int x;               // 球场横坐标 0-100 (0己方球门, 100对方球门)
    private int y;               // 球场纵坐标 0-100
    private boolean success;     // 是否夺回球权
    private int minute;          // 比赛分钟
    public PressEvent(String playerName, int x, int y, boolean success, int minute) {
        this.playerName = playerName;
        this.x = x;
        this.y = y;
        this.success = success;
        this.minute = minute;
    }
    public String getPlayerName() { return playerName; }
    public int getX() { return x; }
    public int getY() { return y; }
    public boolean isSuccess() { return success; }
    public int getMinute() { return minute; }
    @Override
    public String toString() {
        return String.format("%d' %s 在(%d,%d) 逼抢%s",
                minute, playerName, x, y, success ? "成功✅" : "失败❌");
    }
}
/**
 * 高位逼抢统计器
 */
public class HighPressStat {
    // 前场区域阈值:x 坐标 > 66 视为对方前场1/3区域
    private static final int HIGH_PRESS_THRESHOLD = 66;
    /**
     * 判断是否为高位逼抢区域
     */
    public static boolean isHighPressZone(PressEvent e) {
        return e.getX() > HIGH_PRESS_THRESHOLD;
    }
    /**
     * 统计高位逼抢夺回球权次数
     */
    public static long countHighPressRecoveries(List<PressEvent> events) {
        return events.stream()
                .filter(HighPressStat::isHighPressZone)  // 在前场区域
                .filter(PressEvent::isSuccess)           // 成功夺回
                .count();
    }
    /**
     * 按球员统计高位逼抢成功次数
     */
    public static void countByPlayer(List<PressEvent> events) {
        System.out.println("=== 各球员高位逼抢成功次数 ===");
        events.stream()
                .filter(HighPressStat::isHighPressZone)
                .filter(PressEvent::isSuccess)
                .collect(Collectors.groupingBy(PressEvent::getPlayerName, Collectors.counting()))
                .forEach((player, count) ->
                        System.out.println(player + " : " + count + " 次"));
    }
    public static void main(String[] args) {
        // 模拟比赛逼抢事件数据
        List<PressEvent> events = new ArrayList<>();
        events.add(new PressEvent("梅西",   80, 40, true,  12));
        events.add(new PressEvent("苏亚雷斯", 45, 30, true,  20)); // 中场,不算高位
        events.add(new PressEvent("梅西",   75, 50, true,  35));
        events.add(new PressEvent("格列兹曼", 85, 20, false, 42));
        events.add(new PressEvent("布斯克茨", 30, 60, true,  55)); // 后场,不算
        events.add(new PressEvent("梅西",   70, 70, true,  60));
        events.add(new PressEvent("苏亚雷斯", 90, 45, true,  72));
        events.add(new PressEvent("格列兹曼", 68, 35, true,  80));
        events.add(new PressEvent("梅西",   60, 50, true,  88)); // 中场,不算
        System.out.println("=== 全部逼抢事件 ===");
        events.forEach(System.out::println);
        long total = countHighPressRecoveries(events);
        System.out.println("\n【统计结果】");
        System.out.println("高位逼抢夺回球权总次数: " + total + " 次");
        System.out.println();
        countByPlayer(events);
    }
}

运行结果

=== 全部逼抢事件 ===
12' 梅西 在(80,40) 逼抢成功✅
20' 苏亚雷斯 在(45,30) 逼抢成功✅
35' 梅西 在(75,50) 逼抢成功✅
42' 格列兹曼 在(85,20) 逼抢失败❌
55' 布斯克茨 在(30,60) 逼抢成功✅
60' 梅西 在(70,70) 逼抢成功✅
72' 苏亚雷斯 在(90,45) 逼抢成功✅
80' 格列兹曼 在(68,35) 逼抢成功✅
88' 梅西 在(60,50) 逼抢成功✅
【统计结果】
高位逼抢夺回球权总次数: 5 次
=== 各球员高位逼抢成功次数 ===
梅西 : 3 次
苏亚雷斯 : 1 次
格列兹曼 : 1 次

核心逻辑解析

步骤 判断条件 说明
① 位置判断 x > 66 前场1/3区域,符合高位逼抢定义
② 结果判断 success == true 成功夺回球权
③ 计数 Stream .count() 统计满足条件的次数

扩展方向

  1. 分区域细化:将球场分为左/中/右三路,统计各路逼抢效率
  2. 成功率:成功次数 / 总逼抢次数 × 100%
  3. 时间维度:统计每个15分钟时段的逼抢次数,分析体能影响
  4. 对手关联:记录被逼抢的对方球员,分析其失误率
  5. 数据来源:可从 CSV / JSON 文件读取真实比赛数据
  • ✅ 高位逼抢的判定核心是"位置 + 结果"双条件
  • ✅ 使用 Java 8 Stream API 让统计代码简洁清晰
  • ✅ 通过 groupingBy 可轻松实现按球员分组统计
  • ✅ 阈值 66 可根据战术定义灵活调整(如定义为 x > 50 为半场逼抢)

如需对接真实数据(如 Opta、StatsBomb 格式),可以在此基础上增加 JSON 解析即可。

上一篇根据java案例,客队客场表现如何评估?

下一篇当前分类已是最新一篇

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