Java案例:统计直塞球成功率
下面是一个完整的Java示例,演示如何统计足球比赛中"直塞球"(Through Ball)的成功率。

需求分析
直塞球成功率 = 成功直塞次数 / 总直塞次数 × 100%
需要统计的数据:
- 球员每次尝试直塞
- 直塞是否成功(成功=队友接到球形成威胁,失败=被断/出界/越位等)
代码实现
定义数据模型
// 直塞球记录
class ThroughBallRecord {
private String playerName; // 球员姓名
private int minute; // 发生时间(分钟)
private boolean success; // 是否成功
public ThroughBallRecord(String playerName, int minute, boolean success) {
this.playerName = playerName;
this.minute = minute;
this.success = success;
}
public String getPlayerName() { return playerName; }
public int getMinute() { return minute; }
public boolean isSuccess() { return success; }
}
// 球员统计结果
class PlayerStats {
private String playerName;
private int total; // 总直塞次数
private int successCount; // 成功次数
public PlayerStats(String playerName) {
this.playerName = playerName;
this.total = 0;
this.successCount = 0;
}
public void addRecord(boolean success) {
total++;
if (success) successCount++;
}
public double getSuccessRate() {
if (total == 0) return 0.0;
return successCount * 100.0 / total;
}
public String getPlayerName() { return playerName; }
public int getTotal() { return total; }
public int getSuccessCount() { return successCount; }
}
核心统计逻辑
import java.util.*;
import java.util.stream.Collectors;
public class ThroughBallStatistics {
public static void main(String[] args) {
// 模拟一场比赛中的直塞球数据
List<ThroughBallRecord> records = Arrays.asList(
new ThroughBallRecord("德布劳内", 12, true),
new ThroughBallRecord("德布劳内", 25, false),
new ThroughBallRecord("B席", 33, true),
new ThroughBallRecord("德布劳内", 45, true),
new ThroughBallRecord("哈兰德", 52, false),
new ThroughBallRecord("德布劳内", 67, true),
new ThroughBallRecord("B席", 71, true),
new ThroughBallRecord("福登", 78, false),
new ThroughBallRecord("德布劳内", 84, true),
new ThroughBallRecord("福登", 90, true)
);
// ========== 1. 全队整体成功率 ==========
long totalCount = records.size();
long successCount = records.stream()
.filter(ThroughBallRecord::isSuccess)
.count();
double teamRate = totalCount == 0 ? 0 : successCount * 100.0 / totalCount;
System.out.println("=========== 全队直塞球统计 ===========");
System.out.printf("总直塞次数: %d%n", totalCount);
System.out.printf("成功次数: %d%n", successCount);
System.out.printf("失败次数: %d%n", (totalCount - successCount));
System.out.printf("整体成功率: %.2f%%%n%n", teamRate);
// ========== 2. 按球员分别统计 ==========
Map<String, PlayerStats> playerStatsMap = new LinkedHashMap<>();
for (ThroughBallRecord record : records) {
playerStatsMap
.computeIfAbsent(record.getPlayerName(), PlayerStats::new)
.addRecord(record.isSuccess());
}
System.out.println("=========== 各球员直塞成功率 ===========");
System.out.printf("%-10s %-10s %-10s %-10s%n",
"球员", "总次数", "成功次数", "成功率");
System.out.println("------------------------------------------");
// 按成功率降序排序输出
playerStatsMap.values().stream()
.sorted((a, b) -> Double.compare(b.getSuccessRate(), a.getSuccessRate()))
.forEach(ps -> System.out.printf("%-12s %-12d %-12d %.2f%%%n",
ps.getPlayerName(), ps.getTotal(), ps.getSuccessCount(),
ps.getSuccessRate()));
}
}
运行结果
=========== 全队直塞球统计 ===========
总直塞次数: 10
成功次数: 7
失败次数: 3
整体成功率: 70.00%
=========== 各球员直塞成功率 ===========
球员 总次数 成功次数 成功率
------------------------------------------
B席 2 2 100.00%
德布劳内 5 4 80.00%
福登 2 1 50.00%
哈兰德 1 0 0.00%
扩展:区域化统计(进阶)
如果需要按传球区域统计(右路/中路/左路),可扩展数据模型:
enum Zone { LEFT, CENTER, RIGHT }
// 按区域分组统计
Map<Zone, Double> zoneRates = records.stream()
.filter(r -> r instanceof ZoneThroughBall)
.collect(Collectors.groupingBy(
r -> ((ZoneThroughBall) r).getZone(),
Collectors.collectingAndThen(
Collectors.toList(),
list -> {
long ok = list.stream().filter(ThroughBallRecord::isSuccess).count();
return ok * 100.0 / list.size();
}
)
));
关键点说明
| 要点 | 说明 |
|---|---|
| 成功率公式 | 成功率 = 成功次数 / 总次数 × 100% |
| 防除零 | 无数据时返回 0,避免 NaN |
| 数据结构 | 用 Map<球员, 统计对象> 实现分组汇总 |
| 排序输出 | 用 Stream 的 sorted() 实现按成功率排序 |
| 扩展性 | 可加入区域、时段、对手强度等维度分析 |
业务口径建议
不同足球数据机构对"直塞球成功"定义略有差异,需明确:
- 成功标准:队友是否接到球并形成射门机会?还是仅接到球即算成功?
- 是否包含越位判罚:越位导致触球是否算失败?
- 是否统计传中被断:被对方后卫拦截是否算失败?
建议在实际业务中固定口径后再做统计,保证数据可比较。
需要我进一步扩展为 按区域统计、可视化图表输出 或 从 CSV 文件读取数据 的版本吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播