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

需求分析
高位逼抢:在对方半场(通常是前场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() |
统计满足条件的次数 |
扩展方向
- 分区域细化:将球场分为左/中/右三路,统计各路逼抢效率
- 成功率:
成功次数 / 总逼抢次数 × 100% - 时间维度:统计每个15分钟时段的逼抢次数,分析体能影响
- 对手关联:记录被逼抢的对方球员,分析其失误率
- 数据来源:可从 CSV / JSON 文件读取真实比赛数据
- ✅ 高位逼抢的判定核心是"位置 + 结果"双条件
- ✅ 使用 Java 8 Stream API 让统计代码简洁清晰
- ✅ 通过
groupingBy可轻松实现按球员分组统计 - ✅ 阈值
66可根据战术定义灵活调整(如定义为x > 50为半场逼抢)
如需对接真实数据(如 Opta、StatsBomb 格式),可以在此基础上增加 JSON 解析即可。