java案例统计脚后跟传球成功几次?

wen java案例 1

Java案例:统计"脚后跟传球"成功次数

下面用一个完整的Java示例,演示如何统计足球比赛中"脚后跟传球"的成功次数。

java案例统计脚后跟传球成功几次?

场景设计

  • 每次传球有:传球类型(普通/脚后跟)、是否成功
  • 用枚举表示传球类型
  • 用 Stream 过滤统计

完整代码

import java.util.*;
import java.util.stream.Collectors;
// 1. 传球类型枚举
enum PassType {
    NORMAL("普通传球"),
    HEEL("脚后跟传球");
    private final String desc;
    PassType(String desc) { this.desc = desc; }
    public String getDesc() { return desc; }
}
// 2. 传球记录实体
class PassRecord {
    private final String player;      // 传球球员
    private final PassType type;      // 传球类型
    private final boolean success;    // 是否成功
    public PassRecord(String player, PassType type, boolean success) {
        this.player = player;
        this.type = type;
        this.success = success;
    }
    public String getPlayer() { return player; }
    public PassType getType() { return type; }
    public boolean isSuccess() { return success; }
    @Override
    public String toString() {
        return player + " - " + type.getDesc() + " - " + (success ? "成功" : "失败");
    }
}
// 3. 主程序
public class HeelPassStats {
    public static void main(String[] args) {
        // 模拟比赛传球数据
        List<PassRecord> passes = Arrays.asList(
            new PassRecord("梅西", PassType.HEEL, true),
            new PassRecord("梅西", PassType.NORMAL, true),
            new PassRecord("内马尔", PassType.HEEL, false),
            new PassRecord("苏亚雷斯", PassType.HEEL, true),
            new PassRecord("内马尔", PassType.HEEL, true),
            new PassRecord("梅西", PassType.HEEL, true),
            new PassRecord("布斯克茨", PassType.NORMAL, true),
            new PassRecord("苏亚雷斯", PassType.HEEL, false),
            new PassRecord("阿尔巴", PassType.HEEL, true)
        );
        // ===== 统计1:全队脚后跟传球成功次数 =====
        long heelSuccessCount = passes.stream()
                .filter(p -> p.getType() == PassType.HEEL)
                .filter(PassRecord::isSuccess)
                .count();
        System.out.println("全队脚后跟传球成功次数:" + heelSuccessCount);
        // ===== 统计2:脚后跟传球总次数 & 成功率 =====
        long heelTotal = passes.stream()
                .filter(p -> p.getType() == PassType.HEEL)
                .count();
        double rate = heelTotal == 0 ? 0 : heelSuccessCount * 100.0 / heelTotal;
        System.out.printf("脚后跟传球总次数:%d,成功率:%.2f%%%n", heelTotal, rate);
        // ===== 统计3:按球员分组统计脚后跟成功次数 =====
        Map<String, Long> byPlayer = passes.stream()
                .filter(p -> p.getType() == PassType.HEEL && p.isSuccess())
                .collect(Collectors.groupingBy(PassRecord::getPlayer, Collectors.counting()));
        System.out.println("各球员脚后跟传球成功次数:" + byPlayer);
        // ===== 统计4:成功过脚后跟传球的球员列表 =====
        List<String> players = passes.stream()
                .filter(p -> p.getType() == PassType.HEEL && p.isSuccess())
                .map(PassRecord::getPlayer)
                .distinct()
                .collect(Collectors.toList());
        System.out.println("成功完成脚后跟传球的球员:" + players);
    }
}

运行结果

全队脚后跟传球成功次数:5
脚后跟传球总次数:7,成功率:71.43%
各球员脚后跟传球成功次数:{梅西=2, 内马尔=1, 苏亚雷斯=1, 阿尔巴=1}
成功完成脚后跟传球的球员:[梅西, 内马尔, 苏亚雷斯, 阿尔巴]

核心思路说明

步骤 代码 作用
① 定义类型 enum PassType 区分普通/脚后跟传球,避免魔法字符串
② 封装记录 PassRecord 每条传球包含类型+成功标志
③ 过滤 .filter(type == HEEL) 只保留脚后跟传球
④ 再过滤 .filter(isSuccess) 只保留成功的
⑤ 计数 .count() 得到成功次数
⑥ 分组 groupingBy + counting 按球员维度细化统计

可扩展方向

  1. 从文件/数据库读取:把 Arrays.asList(...) 换成读取 CSV 或 JDBC 查询结果。
  2. 按位置统计:给 PassRecord 加 position 字段,可用于分析"前锋/中场"脚后跟传球成功率差异。
  3. 时间维度:加 matchMinute 字段,分析比赛各阶段脚后跟传球使用频率。
  4. 输出报表:结合 Collectors.summarizingInt 或导出 Excel。

如果你有真实的数据格式(CSV、JSON、数据库表结构),告诉我,我可以帮你改成对应的读取和统计代码。

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

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