java案例统计定位球得分占比多少?

wen java案例 1

Java案例:统计定位球得分占比

下面用一个完整的Java案例,模拟统计一支球队的进球方式,并计算定位球得分占比。

java案例统计定位球得分占比多少?

需求分析

  • 统计球队所有进球
  • 区分进球方式:运动战、定位球(任意球、角球、点球)
  • 计算:定位球得分占比 = 定位球进球数 / 总进球数 × 100%

完整代码

import java.util.*;
/**
 * 进球方式枚举
 */
enum GoalType {
    OPEN_PLAY("运动战"),
    FREE_KICK("任意球"),
    CORNER_KICK("角球"),
    PENALTY("点球");
    private final String desc;
    GoalType(String desc) {
        this.desc = desc;
    }
    public String getDesc() {
        return desc;
    }
    // 判断是否为定位球
    public boolean isSetPiece() {
        return this == FREE_KICK || this == CORNER_KICK || this == PENALTY;
    }
}
/**
 * 进球记录
 */
class Goal {
    private final String player;   // 进球球员
    private final GoalType type;   // 进球方式
    public Goal(String player, GoalType type) {
        this.player = player;
        this.type = type;
    }
    public String getPlayer() { return player; }
    public GoalType getType() { return type; }
}
/**
 * 统计工具类
 */
public class SetPieceStats {
    public static void main(String[] args) {
        // 1. 模拟一支球队的进球数据
        List<Goal> goals = new ArrayList<>();
        goals.add(new Goal("梅西",   GoalType.OPEN_PLAY));
        goals.add(new Goal("梅西",   GoalType.FREE_KICK));
        goals.add(new Goal("苏亚雷斯", GoalType.PENALTY));
        goals.add(new Goal("内马尔",  GoalType.OPEN_PLAY));
        goals.add(new Goal("拉基蒂奇", GoalType.CORNER_KICK));
        goals.add(new Goal("梅西",   GoalType.OPEN_PLAY));
        goals.add(new Goal("库蒂尼奥", GoalType.FREE_KICK));
        goals.add(new Goal("苏亚雷斯", GoalType.OPEN_PLAY));
        // 2. 统计
        int total = goals.size();
        int setPieceCount = 0;
        Map<GoalType, Integer> typeCount = new EnumMap<>(GoalType.class);
        for (Goal g : goals) {
            typeCount.merge(g.getType(), 1, Integer::sum);
            if (g.getType().isSetPiece()) {
                setPieceCount++;
            }
        }
        // 3. 计算占比
        double ratio = total == 0 ? 0 : (double) setPieceCount / total * 100;
        // 4. 输出结果
        System.out.println("===== 球队进球统计 =====");
        System.out.println("总进球数: " + total);
        typeCount.forEach((k, v) ->
                System.out.printf("  %-6s: %d 球%n", k.getDesc(), v));
        System.out.println("\n===== 定位球分析 =====");
        System.out.println("定位球进球数: " + setPieceCount);
        System.out.printf("定位球得分占比: %.2f%%%n", ratio);
    }
}

运行结果

===== 球队进球统计 =====
总进球数: 8
  运动战 : 4 球
  任意球 : 2 球
  角球  : 1 球
  点球  : 1 球
===== 定位球分析 =====
定位球进球数: 4
定位球得分占比: 50.00%

代码要点说明

要点 说明
enum GoalType 用枚举管理进球类型,便于扩展和判断
isSetPiece() 把"是否为定位球"的规则收敛到枚举内部,避免主逻辑出现多个
EnumMap 专门针对枚举 key 的高性能 Map,比 HashMap 更省内存
merge() Java 8+ 一行搞定计数
防除零 total == 0 ? 0 : ... 避免空数据抛异常
格式化输出 %.2f%% 保留两位小数

扩展思路

  1. 多队对比:把 List<Goal> 换成 Map<String, List<Goal>>,一次统计多支球队的定位球占比。
  2. 按球员分析:统计每位球员的定位球贡献率。
  3. 读取真实数据:从 CSV / JSON 文件中读取比赛数据,替换硬编码的进球列表。
  4. 按赛季/赛事分组:使用 Stream 的 groupingBy 按赛季、联赛分组统计。

例如用 Stream 简化版统计:

long setPieceCount = goals.stream()
        .filter(g -> g.getType().isSetPiece())
        .count();
double ratio = goals.isEmpty() ? 0 : setPieceCount * 100.0 / goals.size();

这样就完成了一个清晰的"定位球得分占比"统计案例,如果需要我扩展成读取真实比赛数据或多队对比的版本,告诉我即可。

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