这个java案例显示低平球传中次数?

wen java案例 3

Java 统计"低平球传中"次数案例

下面给你一个完整的 Java 案例,模拟从比赛事件数据中统计低平球传中次数。

这个java案例显示低平球传中次数?

需求说明

足球比赛中传中方式分为:

  • 高球传中(High Cross)
  • 低平球传中(Low Cross) ← 我们要统计的
  • 倒三角传中(Cut-back)

目标:从事件列表中筛选出类型为 LOW_CROSS 的事件并计数。

完整代码

import java.util.ArrayList;
import java.util.List;
// 1. 定义传球类型枚举
enum CrossType {
    HIGH_CROSS("高球传中"),
    LOW_CROSS("低平球传中"),
    CUT_BACK("倒三角传中");
    private final String desc;
    CrossType(String desc) { this.desc = desc; }
    public String getDesc() { return desc; }
}
// 2. 事件实体
class MatchEvent {
    private String player;      // 球员
    private int minute;         // 分钟
    private CrossType type;     // 传球类型
    private boolean success;    // 是否成功
    public MatchEvent(String player, int minute, CrossType type, boolean success) {
        this.player = player;
        this.minute = minute;
        this.type = type;
        this.success = success;
    }
    public CrossType getType() { return type; }
    public boolean isSuccess() { return success; }
    public String getPlayer() { return player; }
    public int getMinute() { return minute; }
    @Override
    public String toString() {
        return minute + "' " + player + " - " + type.getDesc()
                + (success ? "(成功)" : "(失败)");
    }
}
public class CrossStatistics {
    public static void main(String[] args) {
        // 3. 模拟比赛事件数据
        List<MatchEvent> events = new ArrayList<>();
        events.add(new MatchEvent("梅西",   12, CrossType.LOW_CROSS,  true));
        events.add(new MatchEvent("迪马利亚", 23, CrossType.HIGH_CROSS, false));
        events.add(new MatchEvent("梅西",   35, CrossType.LOW_CROSS,  false));
        events.add(new MatchEvent("阿尔瓦雷斯", 48, CrossType.CUT_BACK, true));
        events.add(new MatchEvent("迪马利亚", 60, CrossType.LOW_CROSS, true));
        events.add(new MatchEvent("梅西",   75, CrossType.HIGH_CROSS, true));
        events.add(new MatchEvent("劳塔罗",  88, CrossType.LOW_CROSS,  false));
        // 4. 使用 Stream 统计低平球传中次数
        long lowCrossCount = events.stream()
                .filter(e -> e.getType() == CrossType.LOW_CROSS)   // 筛选低平球
                .count();
        // 5. 顺便统计成功的低平球传中
        long lowCrossSuccess = events.stream()
                .filter(e -> e.getType() == CrossType.LOW_CROSS && e.isSuccess())
                .count();
        // 6. 输出结果
        System.out.println("=== 低平球传中明细 ===");
        events.stream()
                .filter(e -> e.getType() == CrossType.LOW_CROSS)
                .forEach(System.out::println);
        System.out.println("\n低平球传中总次数:" + lowCrossCount);
        System.out.println("其中成功次数:" + lowCrossSuccess);
        System.out.println("成功率:" +
                String.format("%.1f%%", lowCrossSuccess * 100.0 / lowCrossCount));
    }
}

运行结果

=== 低平球传中明细 ===
12' 梅西 - 低平球传中(成功)
35' 梅西 - 低平球传中(失败)
60' 迪马利亚 - 低平球传中(成功)
88' 劳塔罗 - 低平球传中(失败)
低平球传中总次数:4
其中成功次数:2
成功率:50.0%

关键点解析

步骤 说明
枚举 CrossType 用枚举区分三种传中类型,避免字符串硬编码
filter + count Java 8 Stream 一行搞定计数
e.getType() == CrossType.LOW_CROSS 枚举比较用 即可(唯一实例)
二次统计 再叠加 isSuccess() 可算成功率

扩展:按球员分组统计低平球传中

如果想看每个球员传了几次低平球传中:

Map<String, Long> byPlayer = events.stream()
        .filter(e -> e.getType() == CrossType.LOW_CROSS)
        .collect(Collectors.groupingBy(
                MatchEvent::getPlayer,
                Collectors.counting()));
System.out.println(byPlayer);
// 输出: {梅西=2, 迪马利亚=1, 劳塔罗=1}

如果你有真实的比赛数据源(比如从 Opta、SofaScore 或 JSON 文件读取),可以告诉我格式,我帮你改成从文件里读取统计。

上一篇综合java案例,大小球走势怎么看?

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

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