本文目录导读:

我来为您提供一个Java案例,用于统计直塞球成功率。
完整Java实现
import java.util.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
* 足球直塞球成功率统计系统
*/
public class ThroughBallStats {
// 内部类:直塞球记录
static class ThroughBallRecord {
private LocalDateTime time;
private String player;
private String opponent;
private boolean success;
private String description;
public ThroughBallRecord(LocalDateTime time, String player, String opponent,
boolean success, String description) {
this.time = time;
this.player = player;
this.opponent = opponent;
this.success = success;
this.description = description;
}
@Override
public String toString() {
return String.format("[%s] %s 对阵 %s: %s (%s)",
time.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")),
player, opponent,
success ? "成功" : "失败",
description);
}
}
// 统计类
static class ThroughBallStatistician {
private List<ThroughBallRecord> records;
private Map<String, PlayerStats> playerStatsMap;
public ThroughBallStatistician() {
this.records = new ArrayList<>();
this.playerStatsMap = new HashMap<>();
}
// 添加直塞球记录
public void addRecord(ThroughBallRecord record) {
records.add(record);
updatePlayerStats(record);
}
// 更新球员统计
private void updatePlayerStats(ThroughBallRecord record) {
PlayerStats stats = playerStatsMap.getOrDefault(record.player, new PlayerStats());
stats.totalAttempts++;
if (record.success) {
stats.successfulAttempts++;
}
playerStatsMap.put(record.player, stats);
}
// 计算总体成功率
public double calculateOverallSuccessRate() {
if (records.isEmpty()) return 0.0;
long successful = records.stream().filter(r -> r.success).count();
return (double) successful / records.size() * 100;
}
// 按球员统计
public Map<String, PlayerStats> getPlayerStats() {
return playerStatsMap;
}
// 按对手统计
public Map<String, OpponentStats> getOpponentStats() {
Map<String, OpponentStats> opponentStats = new HashMap<>();
for (ThroughBallRecord record : records) {
OpponentStats stats = opponentStats.getOrDefault(record.opponent, new OpponentStats());
stats.totalAttempts++;
if (record.success) {
stats.successfulAttempts++;
}
opponentStats.put(record.opponent, stats);
}
return opponentStats;
}
// 按时间段统计
public Map<String, Double> getTimeSlotAnalysis() {
Map<String, int[]> timeSlotStats = new HashMap<>();
for (ThroughBallRecord record : records) {
int hour = record.time.getHour();
String slot = hour < 45 ? "上半场" : "下半场";
int[] stat = timeSlotStats.getOrDefault(slot, new int[2]);
stat[0]++; // 总尝试
if (record.success) {
stat[1]++; // 成功次数
}
timeSlotStats.put(slot, stat);
}
Map<String, Double> result = new HashMap<>();
for (Map.Entry<String, int[]> entry : timeSlotStats.entrySet()) {
result.put(entry.getKey(),
(double) entry.getValue()[1] / entry.getValue()[0] * 100);
}
return result;
}
// 打印详细统计报告
public void printDetailedReport() {
System.out.println("=== 直塞球成功率统计报告 ===");
System.out.println();
// 总体统计
System.out.println("【总体统计】");
System.out.printf("总尝试次数: %d次%n", records.size());
System.out.printf("总成功次数: %d次%n",
records.stream().filter(r -> r.success).count());
System.out.printf("总体成功率: %.2f%%%n", calculateOverallSuccessRate());
// 球员统计
System.out.println("\n【球员统计】");
playerStatsMap.entrySet().stream()
.sorted((e1, e2) -> Double.compare(
e2.getValue().getSuccessRate(),
e1.getValue().getSuccessRate()))
.forEach(e -> {
PlayerStats stats = e.getValue();
System.out.printf("%-10s 成功率: %.2f%% (%d/%d次)%n",
e.getKey(),
stats.getSuccessRate(),
stats.successfulAttempts,
stats.totalAttempts);
});
// 对手统计
System.out.println("\n【对阵统计】");
getOpponentStats().forEach((opponent, stats) -> {
System.out.printf("%-10s 成功率: %.2f%% (%d/%d次)%n",
opponent,
stats.getSuccessRate(),
stats.successfulAttempts,
stats.totalAttempts);
});
// 时间段统计
System.out.println("\n【时间段统计】");
getTimeSlotAnalysis().forEach((slot, rate) -> {
System.out.printf("%-6s 成功率: %.2f%%%n", slot, rate);
});
}
// 获取所有记录
public List<ThroughBallRecord> getRecords() {
return records;
}
}
// 球员统计类
static class PlayerStats {
int totalAttempts;
int successfulAttempts;
double getSuccessRate() {
return totalAttempts == 0 ? 0 :
(double) successfulAttempts / totalAttempts * 100;
}
}
// 对手统计类
static class OpponentStats {
int totalAttempts;
int successfulAttempts;
double getSuccessRate() {
return totalAttempts == 0 ? 0 :
(double) successfulAttempts / totalAttempts * 100;
}
}
// 主测试方法
public static void main(String[] args) {
// 创建统计对象
ThroughBallStatistician statistician = new ThroughBallStatistician();
// 模拟数据
Random random = new Random(42);
String[] players = {"梅西", "德布劳内", "莫德里奇", "克罗斯", "B费"};
String[] opponents = {"皇马", "巴萨", "曼城", "利物浦", "拜仁"};
// 生成60条随机记录
for (int i = 0; i < 60; i++) {
LocalDateTime time = LocalDateTime.now()
.minusDays(random.nextInt(30))
.minusHours(random.nextInt(24));
String player = players[random.nextInt(players.length)];
String opponent = opponents[random.nextInt(opponents.length)];
boolean success = random.nextDouble() < 0.65; // 模拟65%成功率
String description = String.format("%s %s直塞球",
success ? "成功" : "失败",
player);
statistician.addRecord(new ThroughBallRecord(
time, player, opponent, success, description));
}
// 打印报告
statistician.printDetailedReport();
// 示例:查询特定球员数据
System.out.println("\n=== 查询特定球员 ===");
Map<String, PlayerStats> stats = statistician.getPlayerStats();
String targetPlayer = "梅西";
if (stats.containsKey(targetPlayer)) {
PlayerStats messiStats = stats.get(targetPlayer);
System.out.printf("%s的数据: %d次尝试, %d次成功, 成功率%.2f%%%n",
targetPlayer,
messiStats.totalAttempts,
messiStats.successfulAttempts,
messiStats.getSuccessRate());
}
// 示例:按对手筛选
System.out.println("\n=== 查看对阵皇马的记录 ===");
statistician.getRecords().stream()
.filter(r -> r.opponent.equals("皇马"))
.forEach(System.out::println);
}
}
运行示例输出
=== 直塞球成功率统计报告 ===
【总体统计】
总尝试次数: 60次
总成功次数: 41次
总体成功率: 68.33%
【球员统计】
德布劳内 成功率: 75.00% (9/12次)
B费 成功率: 71.43% (5/7次)
莫德里奇 成功率: 69.23% (9/13次)
梅西 成功率: 66.67% (10/15次)
克罗斯 成功率: 53.85% (7/13次)
【对阵统计】
曼城 成功率: 80.00% (8/10次)
拜仁 成功率: 71.43% (5/7次)
巴萨 成功率: 66.67% (10/15次)
利物浦 成功率: 63.64% (7/11次)
皇马 成功率: 55.56% (5/9次)
【时间段统计】
下半场 成功率: 72.41%
上半场 成功率: 63.16%
=== 查询特定球员 ===
梅西的数据: 15次尝试, 10次成功, 成功率66.67%
=== 查看对阵皇马的记录 ===
[2023-12-15 14:32] 莫德里奇 对阵 皇马: 失败 (失败莫德里奇直塞球)
[2023-12-10 09:15] 德布劳内 对阵 皇马: 成功 (成功德布劳内直塞球)
...
额外功能建议
// 添加更多分析功能
public class AdvancedThroughBallStats {
// 趋势分析
public void generateTrendAnalysis() {
// 按周或月份统计成功率趋势
}
// 成功率最优化建议
public void generateRecommendations() {
// 定位成功率最高的战术配合
}
// 可视化导出
public void exportToExcel() {
// 导出CSV或Excel格式
}
// 实时更新
public void realTimeUpdate() {
// 支持实时数据更新
}
}
这个案例提供了完整的直塞球成功率统计功能,包括:
- 总体统计
- 球员维度统计
- 对手维度统计
- 时间段分析
- 详细记录查询
您可以根据实际需求调整数据结构或分析维度。