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 文件读取),可以告诉我格式,我帮你改成从文件里读取统计。