本文目录导读:

我来为你写一个Java案例,统计两队传球成功率并比较哪队更高。
完整代码实现
import java.util.*;
// 传球记录类
class PassRecord {
private String team; // 队伍名称
private boolean success; // 是否成功
public PassRecord(String team, boolean success) {
this.team = team;
this.success = success;
}
public String getTeam() { return team; }
public boolean isSuccess() { return success; }
}
// 统计结果类
class TeamStats {
String teamName;
int totalPasses;
int successPasses;
public TeamStats(String teamName) {
this.teamName = teamName;
}
public void addPass(boolean success) {
totalPasses++;
if (success) successPasses++;
}
public double getSuccessRate() {
return totalPasses == 0 ? 0 : (double) successPasses / totalPasses * 100;
}
@Override
public String toString() {
return String.format("%s: 总传球 %d 次, 成功 %d 次, 成功率 %.2f%%",
teamName, totalPasses, successPasses, getSuccessRate());
}
}
public class PassSuccessRateDemo {
public static void main(String[] args) {
// 1. 模拟比赛传球数据(真实场景可从文件/数据库/API读取)
List<PassRecord> records = new ArrayList<>();
Random random = new Random(42); // 固定种子便于复现
// 模拟A队80次传球,成功率约85%
for (int i = 0; i < 80; i++) {
records.add(new PassRecord("Team A", random.nextDouble() < 0.85));
}
// 模拟B队75次传球,成功率约78%
for (int i = 0; i < 75; i++) {
records.add(new PassRecord("Team B", random.nextDouble() < 0.78));
}
// 2. 使用Map统计每队数据
Map<String, TeamStats> statsMap = new LinkedHashMap<>();
for (PassRecord record : records) {
statsMap.computeIfAbsent(record.getTeam(), TeamStats::new)
.addPass(record.isSuccess());
}
// 3. 输出统计结果
System.out.println("========== 传球统计结果 ==========");
statsMap.values().forEach(System.out::println);
// 4. 找出成功率更高的队伍
TeamStats best = null;
for (TeamStats stat : statsMap.values()) {
if (best == null || stat.getSuccessRate() > best.getSuccessRate()) {
best = stat;
}
}
System.out.println("\n========== 对比结果 ==========");
if (best != null) {
System.out.printf("传球成功率最高的队伍是: %s (%.2f%%)%n",
best.teamName, best.getSuccessRate());
}
}
}
运行结果示例
========== 传球统计结果 ==========
Team A: 总传球 80 次, 成功 70 次, 成功率 87.50%
Team B: 总传球 75 次, 成功 60 次, 成功率 80.00%
========== 对比结果 ==========
传球成功率最高的队伍是: Team A (87.50%)
代码结构说明
| 类/部分 | 作用 |
|---|---|
PassRecord |
封装单次传球记录(队伍 + 成功与否) |
TeamStats |
累计每队传球数据并计算成功率 |
Map<String, TeamStats> |
按队伍名分组统计 |
computeIfAbsent |
Java 8+ 优雅地分组,避免判空 |
| 最后循环 | 遍历找出成功率最高的队伍 |
应用到真实场景
如果要从CSV文件读取真实数据,只需替换数据来源部分:
// 示例:从 CSV 读取(格式: team,success)
try (BufferedReader br = new BufferedReader(new FileReader("passes.csv"))) {
String line;
while ((line = br.readLine()) != null) {
String[] parts = line.split(",");
records.add(new PassRecord(parts[0], Boolean.parseBoolean(parts[1])));
}
} catch (IOException e) {
e.printStackTrace();
}
进阶扩展建议
- 按球员统计:给
PassRecord增加playerName字段,可以进一步统计每个球员的成功率。 - 按半场/时间段统计:增加
minute字段,分析上下半场表现。 - 传球类型:区分短传、长传、直塞等类型的成功率。
- 使用 Stream API 简化:
Map<String, Double> rateMap = records.stream() .collect(Collectors.groupingBy( PassRecord::getTeam, Collectors.averagingInt(r -> r.isSuccess() ? 1 : 0) )); - 可视化:配合 JFreeChart 输出柱状图对比。
需要我加上按球员细分或Stream 版本的完整代码吗?