根据java案例,进攻三区传球成功率?

wen java案例 1

本文目录导读:

根据java案例,进攻三区传球成功率?

  1. 概念定义(先对齐口径)
  2. Java实现示例
  3. 需要您确认的关键点

概念定义(先对齐口径)

进攻三区(Attacking Third / Final Third):足球场按纵向划分为三个区域,进攻三区通常指靠近对方球门的1/3区域。

进攻三区传球成功率 = 进攻三区内成功传球次数 ÷ 进攻三区内传球总次数 × 100%

判定要点(不同案例可能不同,需确认):

  • 传球起点是否必须在进攻三区?还是终点在?还是起点在进攻三区(常见口径)
  • 何为“成功传球”:队友接到球且未丢失球权
  • 是否排除传中、长传、被犯规中断等特殊情况

Java实现示例

数据模型

import java.util.*;
// 传球事件
class PassEvent {
    String passId;
    String fromPlayer;
    String toPlayer;
    double startX;   // 0~100,纵向坐标(0=本方球门,100=对方球门)
    double startY;   // 0~100,横向坐标
    double endX;
    double endY;
    boolean success; // 是否成功传到队友脚下
    public PassEvent(String passId, String fromPlayer, String toPlayer,
                     double startX, double startY, double endX, double endY,
                     boolean success) {
        this.passId = passId;
        this.fromPlayer = fromPlayer;
        this.toPlayer = toPlayer;
        this.startX = startX;
        this.startY = startY;
        this.endX = endX;
        this.endY = endY;
        this.success = success;
    }
}

核心计算逻辑

public class AttackingThirdPassAnalyzer {
    // 进攻三区阈值:纵向坐标 >= 66.7 视为进入进攻三区(按起点判定)
    private static final double FINAL_THIRD_THRESHOLD = 66.7;
    /**
     * 判断传球是否发生在进攻三区(以传球起点为准)
     */
    private static boolean isInFinalThird(PassEvent p) {
        return p.startX >= FINAL_THIRD_THRESHOLD;
    }
    /**
     * 计算进攻三区传球成功率
     * @return 成功率百分比,若无传球数据返回 -1
     */
    public static double calcFinalThirdPassSuccessRate(List<PassEvent> passes) {
        int total = 0;
        int success = 0;
        for (PassEvent p : passes) {
            if (isInFinalThird(p)) {
                total++;
                if (p.success) {
                    success++;
                }
            }
        }
        if (total == 0) {
            return -1; // 无数据
        }
        return (double) success / total * 100.0;
    }
    /**
     * 输出详细统计(可选)
     */
    public static void printReport(List<PassEvent> passes) {
        int total = 0, success = 0, fail = 0;
        for (PassEvent p : passes) {
            if (isInFinalThird(p)) {
                total++;
                if (p.success) success++;
                else fail++;
            }
        }
        double rate = total == 0 ? 0 : (double) success / total * 100;
        System.out.printf("进攻三区传球总数: %d%n", total);
        System.out.printf("成功传球: %d%n", success);
        System.out.printf("失败传球: %d%n", fail);
        System.out.printf("进攻三区传球成功率: %.2f%%%n", rate);
    }
}

测试用例

public class Main {
    public static void main(String[] args) {
        List<PassEvent> passes = new ArrayList<>();
        // 进攻三区内:成功
        passes.add(new PassEvent("P1", "A", "B", 70, 30, 75, 40, true));
        // 进攻三区内:成功
        passes.add(new PassEvent("P2", "B", "C", 80, 40, 85, 45, true));
        // 进攻三区内:失败
        passes.add(new PassEvent("P3", "C", "D", 68, 50, 60, 55, false));
        // 中场区域:不计入
        passes.add(new PassEvent("P4", "D", "E", 50, 50, 55, 60, true));
        // 进攻三区内:失败
        passes.add(new PassEvent("P5", "E", "F", 75, 20, 90, 25, false));
        AttackingThirdPassAnalyzer.printReport(passes);
        double rate = AttackingThirdPassAnalyzer.calcFinalThirdPassSuccessRate(passes);
        System.out.printf("返回值: %.2f%%%n", rate);
    }
}

运行结果

进攻三区传球总数: 4
成功传球: 2
失败传球: 2
进攻三区传球成功率: 50.00%
返回值: 50.00%

需要您确认的关键点

如果您的Java案例对以下口径有特殊定义,请告诉我,我帮您改代码:

项目 常见可选口径
区域判定 起点在进攻三区 / 终点在进攻三区 / 起点终点均在
坐标系 x=0在本方禁区(案例里常见)还是 x=0在中线
阈值 7(1/3)还是 70 或其他
成功定义 是否排除传中、是否排除被抢断但队友补救等
数据来源 CSV/JSON/数据库/硬编码对象

您把案例里的原始需求描述或数据结构发给我,我可以直接改成与您案例完全一致的版本(含CSV读取、Stream API写法、单元测试等)。

上一篇根据实时java案例,越位陷阱使用得当吗?

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

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

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