Java 案例:统计篮球运动员"假动作晃过防守"次数
下面是一个完整的 Java 示例,模拟统计球员使用假动作(如投篮假动作、变向假动作等)成功晃过防守的次数。

场景设计
- 每次进攻回合可能包含多次假动作
- 只有"防守者失去平衡/重心"的假动作才算"晃过"
- 需要按球员、按动作类型统计成功率
完整代码
import java.util.*;
import java.util.stream.Collectors;
// 假动作类型枚举
enum FakeMoveType {
SHOOT_FAKE("投篮假动作"),
DRIVE_FAKE("突破假动作"),
PASS_FAKE("传球假动作"),
STEP_BACK("后撤步假动作");
private final String desc;
FakeMoveType(String desc) { this.desc = desc; }
public String getDesc() { return desc; }
}
// 一次假动作记录
class FakeMove {
private final String player;
private final FakeMoveType type;
private final boolean defenderOffBalance; // 防守者是否被晃开
public FakeMove(String player, FakeMoveType type, boolean defenderOffBalance) {
this.player = player;
this.type = type;
this.defenderOffBalance = defenderOffBalance;
}
public String getPlayer() { return player; }
public FakeMoveType getType() { return type; }
public boolean isDefenderOffBalance() { return defenderOffBalance; }
}
public class FakeMoveStats {
public static void main(String[] args) {
// 模拟一场比赛的数据
List<FakeMove> moves = Arrays.asList(
new FakeMove("詹姆斯", FakeMoveType.SHOOT_FAKE, true),
new FakeMove("詹姆斯", FakeMoveType.SHOOT_FAKE, false),
new FakeMove("詹姆斯", FakeMoveType.DRIVE_FAKE, true),
new FakeMove("库里", FakeMoveType.SHOOT_FAKE, true),
new FakeMove("库里", FakeMoveType.SHOOT_FAKE, true),
new FakeMove("库里", FakeMoveType.PASS_FAKE, false),
new FakeMove("东契奇", FakeMoveType.STEP_BACK, true),
new FakeMove("东契奇", FakeMoveType.STEP_BACK, true),
new FakeMove("东契奇", FakeMoveType.DRIVE_FAKE, true),
new FakeMove("东契奇", FakeMoveType.SHOOT_FAKE, false)
);
// 1. 统计每个球员晃过防守的总次数
Map<String, Long> beatByPlayer = moves.stream()
.filter(FakeMove::isDefenderOffBalance)
.collect(Collectors.groupingBy(FakeMove::getPlayer, Collectors.counting()));
System.out.println("=== 各球员成功晃过防守次数 ===");
beatByPlayer.forEach((p, c) -> System.out.println(p + ": " + c + " 次"));
// 2. 统计每个球员的假动作成功率
System.out.println("\n=== 各球员假动作成功率 ===");
Map<String, List<FakeMove>> byPlayer = moves.stream()
.collect(Collectors.groupingBy(FakeMove::getPlayer));
byPlayer.forEach((player, list) -> {
long success = list.stream().filter(FakeMove::isDefenderOffBalance).count();
double rate = success * 100.0 / list.size();
System.out.printf("%s: %d/%d (%.1f%%)%n",
player, success, list.size(), rate);
});
// 3. 统计哪种假动作最有效
System.out.println("\n=== 各类型假动作成功率 ===");
Map<FakeMoveType, List<FakeMove>> byType = moves.stream()
.collect(Collectors.groupingBy(FakeMove::getType));
byType.entrySet().stream()
.sorted((a, b) -> {
long sa = a.getValue().stream().filter(FakeMove::isDefenderOffBalance).count();
long sb = b.getValue().stream().filter(FakeMove::isDefenderOffBalance).count();
return Long.compare(sb, sa);
})
.forEach(e -> {
List<FakeMove> list = e.getValue();
long success = list.stream().filter(FakeMove::isDefenderOffBalance).count();
double rate = success * 100.0 / list.size();
System.out.printf("%s: 成功 %d 次 / 使用 %d 次 (%.1f%%)%n",
e.getKey().getDesc(), success, list.size(), rate);
});
// 4. 找出"晃人王"
String topPlayer = beatByPlayer.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey).orElse("无");
System.out.println("\n🏆 晃人王: " + topPlayer
+ ",共晃过防守 " + beatByPlayer.get(topPlayer) + " 次");
}
}
运行结果示例
=== 各球员成功晃过防守次数 ===
东契奇: 3 次
詹姆斯: 2 次
库里: 2 次
=== 各球员假动作成功率 ===
东契奇: 3/4 (75.0%)
詹姆斯: 2/3 (66.7%)
库里: 2/3 (66.7%)
=== 各类型假动作成功率 ===
后撤步假动作: 成功 2 次 / 使用 2 次 (100.0%)
投篮假动作: 成功 3 次 / 使用 5 次 (60.0%)
突破假动作: 成功 2 次 / 使用 2 次 (100.0%)
传球假动作: 成功 0 次 / 使用 1 次 (0.0%)
🏆 晃人王: 东契奇,共晃过防守 3 次
关键设计点
| 要素 | 说明 |
|---|---|
| 数据模型 | FakeMove 记录球员、类型、是否晃开防守 |
| 判定标准 | 只有 defenderOffBalance = true 才计为"晃过" |
| Stream 分组 | 用 groupingBy 按球员 / 动作类型分组 |
| 聚合计算 | 计数用 counting(),成功率用 filter + 除法 |
| 可扩展性 | 可加入时间、位置、比赛ID等维度做更细的统计 |
可扩展方向
- 接入真实数据:从 CSV/JSON 或数据库读取比赛事件
- 加入防守者维度:统计"被谁晃过最多"
- 时序分析:假动作成功率随时间的变化
- 可视化输出:导出图表或用 JavaFX 展示
如果你需要接入具体数据源(如从文件读取、或者按真实篮球统计规则定义"晃过"),告诉我具体规则,我可以再调整代码。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播