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%% 保留两位小数 |
扩展思路
- 多队对比:把
List<Goal>换成Map<String, List<Goal>>,一次统计多支球队的定位球占比。 - 按球员分析:统计每位球员的定位球贡献率。
- 读取真实数据:从 CSV / JSON 文件中读取比赛数据,替换硬编码的进球列表。
- 按赛季/赛事分组:使用 Stream 的
groupingBy按赛季、联赛分组统计。
例如用 Stream 简化版统计:
long setPieceCount = goals.stream()
.filter(g -> g.getType().isSetPiece())
.count();
double ratio = goals.isEmpty() ? 0 : setPieceCount * 100.0 / goals.size();
这样就完成了一个清晰的"定位球得分占比"统计案例,如果需要我扩展成读取真实比赛数据或多队对比的版本,告诉我即可。