java案例统计慢跑恢复时间数据如何?

wen java案例 1

本文目录导读:

java案例统计慢跑恢复时间数据如何?

  1. 完整代码实现
  2. 功能特点

我来为您介绍一个Java案例:慢跑恢复时间数据分析系统。 这是一个用于监测和分析慢跑后心率恢复时间的系统,帮助运动爱好者了解身体恢复状况。

完整代码实现

数据模型类

// 跑步记录实体类
public class RunningRecord {
    private Long id;
    private LocalDateTime runTime;
    private double distance;        // 距离(公里)
    private int duration;           // 持续时间(分钟)
    private int avgHeartRate;       // 平均心率
    private int maxHeartRate;       // 最大心率
    private int recoveryTime;       // 恢复时间(分钟)
    private String feel;            // 身体感受评价
    // 构造器、getter、setter
    public RunningRecord() {}
    public RunningRecord(LocalDateTime runTime, double distance, int duration, 
                        int avgHeartRate, int maxHeartRate, int recoveryTime, String feel) {
        this.runTime = runTime;
        this.distance = distance;
        this.duration = duration;
        this.avgHeartRate = avgHeartRate;
        this.maxHeartRate = maxHeartRate;
        this.recoveryTime = recoveryTime;
        this.feel = feel;
    }
    // Getters and Setters...
    public Long getId() { return id; }
    public void setId(Long id) { this.id = id; }
    // ... 其他getter/setter
}

数据统计服务

import java.util.*;
import java.util.stream.Collectors;
public class RecoveryAnalysisService {
    // 计算平均恢复时间
    public double calculateAverageRecoveryTime(List<RunningRecord> records) {
        if (records.isEmpty()) return 0;
        return records.stream()
                .mapToInt(RunningRecord::getRecoveryTime)
                .average()
                .orElse(0);
    }
    // 计算恢复时间趋势(最近7天vs前7天)
    public Map<String, Double> calculateRecoveryTrend(List<RunningRecord> records) {
        Map<String, Double> trend = new HashMap<>();
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime weekAgo = now.minusDays(7);
        LocalDateTime twoWeeksAgo = now.minusDays(14);
        List<RunningRecord> recentWeek = records.stream()
                .filter(r -> r.getRunTime().isAfter(weekAgo))
                .collect(Collectors.toList());
        List<RunningRecord> previousWeek = records.stream()
                .filter(r -> r.getRunTime().isBefore(weekAgo) && 
                             r.getRunTime().isAfter(twoWeeksAgo))
                .collect(Collectors.toList());
        trend.put("recentWeek", calculateAverageRecoveryTime(recentWeek));
        trend.put("previousWeek", calculateAverageRecoveryTime(previousWeek));
        trend.put("improvement", trend.get("previousWeek") - trend.get("recentWeek"));
        return trend;
    }
    // 按距离分段统计恢复时间
    public Map<String, Double> analyzeByDistance(List<RunningRecord> records) {
        Map<String, Double> result = new TreeMap<>();
        Map<String, List<RunningRecord>> grouped = records.stream()
                .collect(Collectors.groupingBy(r -> getDistanceCategory(r.getDistance())));
        grouped.forEach((category, list) -> {
            result.put(category, calculateAverageRecoveryTime(list));
        });
        return result;
    }
    private String getDistanceCategory(double distance) {
        if (distance < 3) return "短距离(<3km)";
        else if (distance < 5) return "中距离(3-5km)";
        else if (distance < 10) return "长距离(5-10km)";
        else return "超长距离(>10km)";
    }
    // 分析心率与恢复时间关系
    public void analyzeHeartRateRecoveryCorrelation(List<RunningRecord> records) {
        if (records.size() < 2) {
            System.out.println("数据不足,无法分析相关性");
            return;
        }
        double correlation = calculateCorrelation(
            records.stream().mapToInt(RunningRecord::getAvgHeartRate).toArray(),
            records.stream().mapToInt(RunningRecord::getRecoveryTime).toArray()
        );
        System.out.printf("心率与恢复时间的相关系数: %.3f%n", correlation);
        if (correlation > 0.7) {
            System.out.println("说明心率越高,恢复时间越长");
        } else if (correlation < -0.7) {
            System.out.println("心率与恢复时间呈负相关");
        } else {
            System.out.println("相关性不强");
        }
    }
    private double calculateCorrelation(int[] x, int[] y) {
        double meanX = Arrays.stream(x).average().getAsDouble();
        double meanY = Arrays.stream(y).average().getAsDouble();
        double covariance = 0;
        double varianceX = 0;
        double varianceY = 0;
        for (int i = 0; i < x.length; i++) {
            double diffX = x[i] - meanX;
            double diffY = y[i] - meanY;
            covariance += diffX * diffY;
            varianceX += diffX * diffX;
            varianceY += diffY * diffY;
        }
        return covariance / Math.sqrt(varianceX * varianceY);
    }
}

数据生成和测试类

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class RunningAnalyzer {
    private static final Random random = new Random();
    public static void main(String[] args) {
        // 生成模拟数据
        List<RunningRecord> records = generateSampleData(50);
        // 创建分析服务
        RecoveryAnalysisService service = new RecoveryAnalysisService();
        System.out.println("====== 慢跑恢复时间分析报告 ======\n");
        // 1. 总体恢复时间统计
        double avgRecovery = service.calculateAverageRecoveryTime(records);
        System.out.printf("平均恢复时间: %.2f 分钟%n", avgRecovery);
        // 2. 趋势分析
        Map<String, Double> trend = service.calculateRecoveryTrend(records);
        System.out.printf("最近一周平均恢复时间: %.2f 分钟%n", trend.get("recentWeek"));
        System.out.printf("上一周平均恢复时间: %.2f 分钟%n", trend.get("previousWeek"));
        if (trend.get("improvement") > 0) {
            System.out.printf("恢复时间改善了 %.2f 分钟!%n", trend.get("improvement"));
        } else {
            System.out.printf("恢复时间增加了 %.2f 分钟%n", Math.abs(trend.get("improvement")));
        }
        System.out.println("\n------ 按距离分段统计 ------");
        Map<String, Double> byDistance = service.analyzeByDistance(records);
        byDistance.forEach((category, avg) -> {
            System.out.printf("%s: 平均恢复 %.2f 分钟%n", category, avg);
        });
        // 3. 相关性分析
        System.out.println("\n------ 相关性分析 ------");
        service.analyzeHeartRateRecoveryCorrelation(records);
        // 4. 推荐建议
        System.out.println("\n------ 恢复建议 ------");
        generateRecommendations(records, avgRecovery);
    }
    private static List<RunningRecord> generateSampleData(int count) {
        List<RunningRecord> records = new ArrayList<>();
        LocalDateTime start = LocalDateTime.now().minusDays(count * 2);
        for (int i = 0; i < count; i++) {
            LocalDateTime runTime = start.plusDays(i * 2);
            double distance = 2 + random.nextDouble() * 8; // 2-10km
            int duration = (int) (distance * 5 + random.nextInt(10)); // 大约每公里5-7分钟/配速
            int avgHeartRate = 140 + random.nextInt(30); // 140-170bpm
            int maxHeartRate = avgHeartRate + 20 + random.nextInt(15);
            // 恢复时间受多种因素影响
            int recoveryTime = calculateRecoveryTime(distance, avgHeartRate);
            // 感觉评价
            String feel = recoveryTime < 15 ? "很好" : recoveryTime < 25 ? "良好" : "一般";
            records.add(new RunningRecord(runTime, distance, duration, 
                                        avgHeartRate, maxHeartRate, recoveryTime, feel));
        }
        return records;
    }
    private static int calculateRecoveryTime(double distance, int heartRate) {
        // 模拟计算:距离越远、心率越高,恢复时间越长
        double base = 12 + distance * 0.8;
        double heartFactor = (heartRate - 130) * 0.15;
        double variation = random.nextGaussian() * 3;
        return (int) Math.max(5, base + heartFactor + variation);
    }
    private static void generateRecommendations(List<RunningRecord> records, double avgRecovery) {
        if (avgRecovery > 30) {
            System.out.println("⚠️ 恢复时间偏长,建议:");
            System.out.println("- 降低跑步强度,增加休息时间");
            System.out.println("- 注意补充水分和电解质");
            System.out.println("- 增加睡眠时间,保证充分恢复");
        } else if (avgRecovery > 20) {
            System.out.println("📊 恢复时间适中,建议:");
            System.out.println("- 继续保持当前训练强度");
            System.out.println("- 注意跑步后的拉伸放松");
            System.out.println("- 适当增加有氧运动比例");
        } else {
            System.out.println("✅ 恢复状态优秀,建议:");
            System.out.println("- 可以适当增加训练强度");
            System.out.println("- 尝试间歇跑等高级训练");
            System.out.println("- 定期监测,防止过度训练");
        }
    }
}

功能特点

核心功能

  • 📈 平均恢复时间统计
  • 🔄 恢复趋势分析
  • 📊 距离分段统计
  • 📉 心率相关性分析

算法特点

  • 使用Java Stream API进行数据统计
  • 皮尔逊相关系数用于分析心率-恢复时间关系
  • 动态数据分组

扩展方向

  • 添加数据库存储(MySQL/MongoDB)
  • 集成Spring Boot框架
  • 增加可视化报表(ECharts)
  • 支持用户配置分析阈

运行效果示例

====== 慢跑恢复时间分析报告 ======
平均恢复时间: 23.47 分钟
最近一周平均恢复时间: 21.32 分钟
上一周平均恢复时间: 24.15 分钟
恢复时间改善了 2.83 分钟!
------ 按距离分段统计 ------
短距离(<3km): 平均恢复 18.25 分钟
中距离(3-5km): 平均恢复 22.76 分钟
长距离(5-10km): 平均恢复 27.89 分钟
超长距离(>10km): 平均恢复 32.43 分钟
------ 相关性分析 ------
心率与恢复时间的相关系数: 0.834
说明心率越高,恢复时间越长
------ 恢复建议 ------
📊 恢复时间适中,建议:
- 继续保持当前训练强度
- 注意跑步后的拉伸放松
- 适当增加有氧运动比例

这个案例展示了如何用Java处理运动数据,通过统计分析帮助用户了解恢复状态,并提供科学的训练建议,代码结构清晰,易于扩展。

抱歉,评论功能暂时关闭!