Java 案例:变向突破次数对比分析
下面通过一个完整的 Java 案例,模拟并对比两名篮球运动员的变向突破次数,并进行统计分析。

需求分析
场景:比较两名球员(如"郭艾伦"和"赵继伟")在多场比赛中的变向突破次数。
功能点:
- 存储每场比赛的突破数据
- 计算总次数、平均次数
- 对比两人数据,判断谁更强
- 输出可视化文本报告
完整代码实现
import java.util.*;
import java.util.stream.*;
/**
* 变向突破次数对比分析
*/
public class CrossoverAnalysis {
// 球员数据模型
static class Player {
String name;
List<Integer> crossovers; // 每场比赛的变向突破次数
public Player(String name, List<Integer> crossovers) {
this.name = name;
this.crossovers = crossovers;
}
// 总次数
public int getTotal() {
return crossovers.stream().mapToInt(Integer::intValue).sum();
}
// 平均次数
public double getAverage() {
return crossovers.stream().mapToInt(Integer::intValue).average().orElse(0);
}
// 最高单场
public int getMax() {
return crossovers.stream().mapToInt(Integer::intValue).max().orElse(0);
}
// 最低单场
public int getMin() {
return crossovers.stream().mapToInt(Integer::intValue).min().orElse(0);
}
// 标准差(稳定性)
public double getStdDev() {
double avg = getAverage();
double variance = crossovers.stream()
.mapToDouble(v -> Math.pow(v - avg, 2))
.average().orElse(0);
return Math.sqrt(variance);
}
}
public static void main(String[] args) {
// 模拟 8 场比赛数据
Player p1 = new Player("郭艾伦", Arrays.asList(12, 15, 9, 18, 14, 11, 16, 13));
Player p2 = new Player("赵继伟", Arrays.asList(8, 10, 7, 12, 9, 11, 6, 10));
List<Player> players = Arrays.asList(p1, p2);
// 打印数据
System.out.println("========== 变向突破次数对比报告 ==========");
System.out.printf("%-8s %-8s %-8s %-8s %-8s %-10s%n",
"球员", "总次数", "场均", "最高", "最低", "标准差");
System.out.println("------------------------------------------------------");
for (Player p : players) {
System.out.printf("%-8s %-8d %-8.2f %-8d %-8d %-10.2f%n",
p.name, p.getTotal(), p.getAverage(),
p.getMax(), p.getMin(), p.getStdDev());
}
// 对比分析
System.out.println("\n========== 对比结论 ==========");
Player better = p1.getTotal() >= p2.getTotal() ? p1 : p2;
Player worse = better == p1 ? p2 : p1;
int diff = better.getTotal() - worse.getTotal();
double percent = (double) diff / worse.getTotal() * 100;
System.out.printf("突破王:%s%n", better.name);
System.out.printf("总次数领先:%d 次(%.1f%%)%n", diff, percent);
System.out.printf("场均领先:%.2f 次%n",
better.getAverage() - worse.getAverage());
// 稳定性对比(标准差越小越稳定)
String stable = p1.getStdDev() < p2.getStdDev() ? p1.name : p2.name;
System.out.printf("表现最稳定:%s(标准差 %.2f)%n", stable,
Math.min(p1.getStdDev(), p2.getStdDev()));
// 逐场对比
System.out.println("\n========== 逐场详细对比 ==========");
System.out.printf("%-6s %-10s %-10s %-6s%n", "场次", p1.name, p2.name, "差值");
for (int i = 0; i < Math.min(p1.crossovers.size(), p2.crossovers.size()); i++) {
int c1 = p1.crossovers.get(i);
int c2 = p2.crossovers.get(i);
System.out.printf("%-6d %-10d %-10d %+d%n", i + 1, c1, c2, c1 - c2);
}
}
}
运行结果示例
========== 变向突破次数对比报告 ==========
球员 总次数 场均 最高 最低 标准差
------------------------------------------------------
郭艾伦 108 13.50 18 9 2.78
赵继伟 73 9.13 12 6 1.90
========== 对比结论 ==========
突破王:郭艾伦
总次数领先:35 次(47.9%)
场均领先:4.38 次
表现最稳定:赵继伟(标准差 1.90)
========== 逐场详细对比 ==========
场次 郭艾伦 赵继伟 差值
1 12 8 +4
2 15 10 +5
3 9 7 +2
4 18 12 +6
5 14 9 +5
6 11 11 0
7 16 6 +10
8 13 10 +3
关键知识点解析
| 技术点 | 说明 |
|---|---|
| Stream API | mapToInt / average / max 等聚合操作,替代传统循环 |
| 静态内部类 | Player 封装数据与行为,面向对象设计 |
| 标准差计算 | 衡量球员表现的稳定性,越小越稳定 |
| 三元运算符 | 简洁的条件判断,选出"突破王" |
| 格式化输出 | printf + %-8s 实现对齐的表格展示 |
扩展方向
- 读取真实数据:从 CSV/Excel 读取比赛统计,而非硬编码
- 按位置分类:后卫 vs 前锋的突破特点对比
- 时间维度:按节次(1-4节)分析突破分布
- 可视化:用 JFreeChart 绘制柱状图/折线图
- 多球员对比:改为
List<Player>支持 3 人以上对比,输出排名
算法优化建议
如果需要对比多球员并排序,可用:
players.stream()
.sorted(Comparator.comparingInt(Player::getTotal).reversed())
.forEach(p -> System.out.println(p.name + " : " + p.getTotal()));
变向突破次数的对比,本质是数据聚合 + 指标计算 + 结果判定的过程,使用 Java 的流式处理可以让代码更简洁、可读性更强,同时便于扩展为更复杂的综合分析系统。