这个java案例如何看半场结束前攻势?

wen java案例 1

如何用 Java 分析足球比赛"半场结束前攻势"

你提到"这个 Java 案例",但没有贴出代码,我先按常见的足球数据分析场景,给你一套通用的分析思路 + 可运行代码,你可以对照自己的案例替换字段。

这个java案例如何看半场结束前攻势?


核心分析逻辑

"半场结束前攻势"通常指 40-45分钟(或含补时) 这一段,判断进攻强度的指标:

指标 含义
射门次数 最直接
射正次数 质量
危险进攻 / 进攻三区触球 压制力
角球、定位球 施压信号
控球率变化 是否主动压上
xG(预期进球) 综合质量

关键点:要对比"这段时间"与"全场平均"或"对手半场其他时段",才能说"攻势强"。


示例代码(假设你的事件数据是 List
import java.util.*;
import java.util.stream.*;
public class HalfTimeAttackAnalyzer {
    // 事件类型
    enum EventType { SHOT, SHOT_ON_TARGET, CORNER, DANGEROUS_ATTACK, GOAL }
    static class Event {
        int minute;          // 比赛分钟
        int teamId;          // 球队
        EventType type;
        double xg = 0;       // 可选
        Event(int m, int t, EventType ty, double x) {
            minute = m; teamId = t; type = ty; xg = x;
        }
    }
    /** 判断是否为"半场结束前"窗口:40' 到 45'+补时 */
    static boolean isEndOfHalfWindow(int minute) {
        return minute >= 40 && minute <= 45; // 若有补时数据可改为 <=47
    }
    public static void main(String[] args) {
        List<Event> events = List.of(
            new Event(12, 1, EventType.SHOT, 0.05),
            new Event(41, 1, EventType.DANGEROUS_ATTACK, 0),
            new Event(42, 1, EventType.SHOT, 0.08),
            new Event(43, 1, EventType.CORNER, 0),
            new Event(44, 1, EventType.SHOT_ON_TARGET, 0.15),
            new Event(45, 2, EventType.SHOT, 0.03),
            new Event(44, 2, EventType.DANGEROUS_ATTACK, 0)
        );
        analyze(events, 1); // 分析球队1
    }
    static void analyze(List<Event> events, int teamId) {
        // 1. 半场结束前窗口事件
        List<Event> endHalf = events.stream()
            .filter(e -> e.teamId == teamId && isEndOfHalfWindow(e.minute))
            .toList();
        // 2. 全场事件(用于对比基准)
        List<Event> all = events.stream()
            .filter(e -> e.teamId == teamId)
            .toList();
        long shotsEnd   = count(endHalf, EventType.SHOT, EventType.SHOT_ON_TARGET);
        long onTarget   = count(endHalf, EventType.SHOT_ON_TARGET);
        long corners    = count(endHalf, EventType.CORNER);
        long dangerAtk  = count(endHalf, EventType.DANGEROUS_ATTACK);
        double xgEnd    = endHalf.stream().mapToDouble(e -> e.xg).sum();
        // 3. 全场每分钟均值(注意:全场按90分钟,半场窗口按5-7分钟)
        int windowMinutes = 7; // 40-45含补时约5-7分钟
        long shotsAll = count(all, EventType.SHOT, EventType.SHOT_ON_TARGET);
        double shotsPerMinAll = shotsAll / 90.0;
        double shotsPerMinEnd = shotsEnd / (double) windowMinutes;
        System.out.println("=== 半场结束前(40'~45'+)攻势分析 ===");
        System.out.println("射门次数: " + shotsEnd);
        System.out.println("射正次数: " + onTarget);
        System.out.println("角球: " + corners);
        System.out.println("危险进攻: " + dangerAtk);
        System.out.println("xG合计: " + String.format("%.2f", xgEnd));
        System.out.printf("射门频率: 全场 %.2f 次/分, 末段 %.2f 次/分%n",
                shotsPerMinAll, shotsPerMinEnd);
        // 4. 结论判断
        if (shotsPerMinEnd > shotsPerMinAll * 1.5) {
            System.out.println("半场结束前攻势明显增强(>1.5倍全场均值)");
        } else if (shotsPerMinEnd > shotsPerMinAll) {
            System.out.println("半场结束前攻势略强于平均");
        } else {
            System.out.println("半场结束前攻势不明显");
        }
    }
    static long count(List<Event> list, EventType... types) {
        Set<EventType> set = Set.of(types);
        return list.stream().filter(e -> set.contains(e.type)).count();
    }
}

输出示例:

=== 半场结束前(40'~45'+)攻势分析 ===
射门次数: 2
射正次数: 1
角球: 1
危险进攻: 1
xG合计: 0.23
射门频率: 全场 0.03 次/分, 末段 0.29 次/分
半场结束前攻势明显增强(>1.5倍全场均值)

看结果的 4 个要点

  1. 绝对值 + 相对值一起看:光看"末段射了3脚"没意义,要对比全场均值 / 对手同时段。
  2. 窗口定义要一致:40-45 还是 35-45?含不含补时?不同口径结论会变。
  3. 区分主动 vs 被动:若末段攻势强但失球也集中,可能是压上被反击——要同时看对方反击数据。
  4. 样本量:单场5分钟样本太小,建议多场聚合(如该队本赛季所有半场末段)。

如果你能提供更多信息

请把你案例中的关键代码片段(数据模型、分析方法)贴出来,我可以:

  • 指出它现在是怎么判断"攻势"的、有没有 bug;
  • 帮你改成上面这种"窗口对比 + 阈值"的方式;
  • 或适配你已有的字段命名。

你现在的案例里,事件数据是什么结构?是按分钟统计还是逐事件?告诉我我再具体化。

上一篇java案例统计红黄牌数量哪队更多?

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

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝