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 |
按球员维度细化统计 |
可扩展方向
- 从文件/数据库读取:把
Arrays.asList(...)换成读取 CSV 或 JDBC 查询结果。 - 按位置统计:给
PassRecord加position字段,可用于分析"前锋/中场"脚后跟传球成功率差异。 - 时间维度:加
matchMinute字段,分析比赛各阶段脚后跟传球使用频率。 - 输出报表:结合
Collectors.summarizingInt或导出 Excel。
如果你有真实的数据格式(CSV、JSON、数据库表结构),告诉我,我可以帮你改成对应的读取和统计代码。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播