Java案例:高速跑动距离对比
下面我用一个完整的Java案例来对比不同运动方式/运动员的高速跑动距离,涵盖面向对象、集合、Stream流、排序、统计等知识点。

需求场景
在足球、篮球等运动分析中,高速跑动距离(如速度 ≥ 20 km/h 的跑动距离)是评估运动员体能和战术的重要指标。
我们模拟一组运动员数据,对比:
- 每名运动员的高速跑动距离
- 不同位置(前锋/中场/后卫)的平均高速跑动距离
- 找出高速跑动最多的Top3
完整代码
import java.util.*;
import java.util.stream.Collectors;
/**
* 运动员类
*/
class Player {
private String name; // 姓名
private String position; // 位置:前锋/中场/后卫
private double totalDistance; // 总跑动距离(km)
private double highSpeedDistance; // 高速跑动距离(km),速度≥20km/h
public Player(String name, String position, double totalDistance, double highSpeedDistance) {
this.name = name;
this.position = position;
this.totalDistance = totalDistance;
this.highSpeedDistance = highSpeedDistance;
}
public String getName() { return name; }
public String getPosition() { return position; }
public double getTotalDistance() { return totalDistance; }
public double getHighSpeedDistance() { return highSpeedDistance; }
/** 高速跑动占比 */
public double getHighSpeedRatio() {
return totalDistance == 0 ? 0 : highSpeedDistance / totalDistance * 100;
}
@Override
public String toString() {
return String.format("%-6s | %-4s | 总跑动: %5.2f km | 高速跑动: %5.2f km | 占比: %5.1f%%",
name, position, totalDistance, highSpeedDistance, getHighSpeedRatio());
}
}
public class HighSpeedRunCompare {
public static void main(String[] args) {
// 1. 准备数据
List<Player> players = Arrays.asList(
new Player("梅西", "前锋", 8.5, 1.20),
new Player("姆巴佩", "前锋", 9.2, 1.85),
new Player("哈兰德", "前锋", 8.8, 1.45),
new Player("德布劳内","中场", 11.5, 1.60),
new Player("莫德里奇","中场", 10.8, 1.10),
new Player("坎特", "中场", 12.0, 1.95),
new Player("范戴克", "后卫", 9.5, 0.75),
new Player("拉莫斯", "后卫", 9.8, 0.95),
new Player("阿诺德", "后卫", 10.5, 1.30)
);
System.out.println("========== 全部运动员数据 ==========");
players.forEach(System.out::println);
// 2. 按高速跑动距离降序排序
System.out.println("\n========== 按高速跑动距离降序 ==========");
players.stream()
.sorted(Comparator.comparingDouble(Player::getHighSpeedDistance).reversed())
.forEach(p -> System.out.printf("%-6s 高速跑动: %.2f km%n",
p.getName(), p.getHighSpeedDistance()));
// 3. Top3 高速跑动
System.out.println("\n========== 高速跑动 Top3 ==========");
players.stream()
.sorted(Comparator.comparingDouble(Player::getHighSpeedDistance).reversed())
.limit(3)
.forEach(p -> System.out.printf("🏆 %-6s %.2f km%n",
p.getName(), p.getHighSpeedDistance()));
// 4. 按位置分组统计平均高速跑动距离
System.out.println("\n========== 按位置统计平均高速跑动 ==========");
Map<String, Double> avgByPosition = players.stream()
.collect(Collectors.groupingBy(
Player::getPosition,
Collectors.averagingDouble(Player::getHighSpeedDistance)
));
avgByPosition.forEach((pos, avg) ->
System.out.printf("%-4s 平均高速跑动: %.2f km%n", pos, avg));
// 5. 找出平均高速跑动最高的位置
String bestPosition = avgByPosition.entrySet().stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElse("无");
System.out.println("\n>>> 平均高速跑动最高的位置: " + bestPosition);
// 6. 整体统计
DoubleSummaryStatistics stats = players.stream()
.mapToDouble(Player::getHighSpeedDistance)
.summaryStatistics();
System.out.println("\n========== 整体统计 ==========");
System.out.printf("总人数: %d%n", stats.getCount());
System.out.printf("平均高速跑动: %.2f km%n", stats.getAverage());
System.out.printf("最大高速跑动: %.2f km%n", stats.getMax());
System.out.printf("最小高速跑动: %.2f km%n", stats.getMin());
// 7. 筛选高速跑动 > 1.5 km 的"高能跑者"
System.out.println("\n========== 高速跑动 > 1.5 km 的高能跑者 ==========");
players.stream()
.filter(p -> p.getHighSpeedDistance() > 1.5)
.forEach(System.out::println);
}
}
运行结果示例
========== 全部运动员数据 ==========
梅西 | 前锋 | 总跑动: 8.50 km | 高速跑动: 1.20 km | 占比: 14.1%
姆巴佩 | 前锋 | 总跑动: 9.20 km | 高速跑动: 1.85 km | 占比: 20.1%
哈兰德 | 前锋 | 总跑动: 8.80 km | 高速跑动: 1.45 km | 占比: 16.5%
德布劳内 | 中场 | 总跑动: 11.50 km | 高速跑动: 1.60 km | 占比: 13.9%
莫德里奇 | 中场 | 总跑动: 10.80 km | 高速跑动: 1.10 km | 占比: 10.2%
坎特 | 中场 | 总跑动: 12.00 km | 高速跑动: 1.95 km | 占比: 16.3%
范戴克 | 后卫 | 总跑动: 9.50 km | 高速跑动: 0.75 km | 占比: 7.9%
拉莫斯 | 后卫 | 总跑动: 9.80 km | 高速跑动: 0.95 km | 占比: 9.7%
阿诺德 | 后卫 | 总跑动: 10.50 km | 高速跑动: 1.30 km | 占比: 12.4%
========== 按高速跑动距离降序 ==========
坎特 高速跑动: 1.95 km
姆巴佩 高速跑动: 1.85 km
德布劳内 高速跑动: 1.60 km
...
========== 高速跑动 Top3 ==========
🏆 坎特 1.95 km
🏆 姆巴佩 1.85 km
🏆 德布劳内 1.60 km
========== 按位置统计平均高速跑动 ==========
中场 平均高速跑动: 1.55 km
前锋 平均高速跑动: 1.50 km
后卫 平均高速跑动: 1.00 km
>>> 平均高速跑动最高的位置: 中场
知识点总结
| 知识点 | 应用位置 |
|---|---|
| 面向对象封装 | Player 类 + getter |
| Arrays.asList | 快速构造球员列表 |
| Stream 排序 | sorted(Comparator...) |
| 分组统计 | Collectors.groupingBy + averagingDouble |
| 聚合统计 | DoubleSummaryStatistics |
| 条件筛选 | filter |
| Top-N 查询 | sorted + limit |
| 方法引用 | Player::getHighSpeedDistance |
扩展思路
- 读入真实数据:从 CSV/Excel 读取 GPS 追踪数据(如 Catapult、STATSports 格式)。
- 多阈值对比:对比 ≥20 km/h、≥25 km/h、≥30 km/h 三档高速跑动距离。
- 可视化:用 JFreeChart 绘制柱状图,直观展示各位置差异。
- 时间序列:记录每5分钟的高速跑动,分析体能下降曲线。
- 数据库存储:用 JDBC/MyBatis 持久化到 MySQL,实现历史对比。
如果你需要 CSV读取版、图表可视化版 或 多阈值对比版,我可以继续扩展。