足球门前抢点射门次数统计对比 - 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() 快速找出效率最高球员 |
扩展建议
- 增加球队维度:将
PlayerStats换成TeamStats,对比两支球队 - 引入时间维度:记录比赛分钟数,分析哪一阶段抢点最多
- 加入射门部位:头球/脚射分类统计
- 数据可视化:导出为 CSV 或 JSON,配合图表展示
- 接入真实数据:从 API(如 Opta、SofaScore)读取比赛事件数据
如果你有具体的球队/球员数据(CSV/Excel),我可以帮你改成读取文件版本的统计程序。