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

wen java案例 2

Java 案例:统计慢跑恢复时间数据

下面是一个完整的 Java 案例,用于统计慢跑后的恢复时间数据(即运动后心率恢复到静息心率所需时间),包含数据录入、统计分析和结果输出。

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

需求分析

慢跑恢复时间:指慢跑结束后,心率从运动峰值恢复到静息心率(或接近静息)所用的时间(分钟)。

需要统计的指标:

  • 样本数量
  • 平均恢复时间
  • 最短 / 最长恢复时间
  • 中位数
  • 标准差
  • 按恢复快慢分级(优/良/一般/差)

完整代码

数据实体类 JoggingRecord.java

package com.example.jogging;
public class JoggingRecord {
    private String runnerName;      // 跑者姓名
    private int peakHeartRate;      // 运动峰值心率
    private int restingHeartRate;   // 静息心率
    private int recoveryTime;       // 恢复时间(分钟)
    private String date;            // 日期
    public JoggingRecord(String runnerName, int peakHeartRate,
                         int restingHeartRate, int recoveryTime, String date) {
        this.runnerName = runnerName;
        this.peakHeartRate = peakHeartRate;
        this.restingHeartRate = restingHeartRate;
        this.recoveryTime = recoveryTime;
        this.date = date;
    }
    // Getters
    public String getRunnerName() { return runnerName; }
    public int getPeakHeartRate() { return peakHeartRate; }
    public int getRestingHeartRate() { return restingHeartRate; }
    public int getRecoveryTime() { return recoveryTime; }
    public String getDate() { return date; }
    @Override
    public String toString() {
        return String.format("%-6s | 峰值:%-3d | 静息:%-3d | 恢复:%-2d分钟 | %s",
                runnerName, peakHeartRate, restingHeartRate, recoveryTime, date);
    }
}

统计分析工具类 RecoveryAnalyzer.java

package com.example.jogging;
import java.util.*;
import java.util.stream.Collectors;
public class RecoveryAnalyzer {
    private final List<JoggingRecord> records;
    public RecoveryAnalyzer(List<JoggingRecord> records) {
        this.records = records;
    }
    /** 平均恢复时间 */
    public double getAverage() {
        return records.stream()
                .mapToInt(JoggingRecord::getRecoveryTime)
                .average()
                .orElse(0);
    }
    /** 最短恢复时间 */
    public int getMin() {
        return records.stream()
                .mapToInt(JoggingRecord::getRecoveryTime)
                .min()
                .orElse(0);
    }
    /** 最长恢复时间 */
    public int getMax() {
        return records.stream()
                .mapToInt(JoggingRecord::getRecoveryTime)
                .max()
                .orElse(0);
    }
    /** 中位数 */
    public double getMedian() {
        List<Integer> sorted = records.stream()
                .map(JoggingRecord::getRecoveryTime)
                .sorted()
                .collect(Collectors.toList());
        int n = sorted.size();
        if (n == 0) return 0;
        if (n % 2 == 1) return sorted.get(n / 2);
        return (sorted.get(n / 2 - 1) + sorted.get(n / 2)) / 2.0;
    }
    /** 标准差(总体) */
    public double getStdDev() {
        double avg = getAverage();
        double variance = records.stream()
                .mapToDouble(r -> Math.pow(r.getRecoveryTime() - avg, 2))
                .average()
                .orElse(0);
        return Math.sqrt(variance);
    }
    /** 按恢复快慢分级 */
    public Map<String, Long> getLevelDistribution() {
        return records.stream()
                .collect(Collectors.groupingBy(
                        r -> classify(r.getRecoveryTime()),
                        TreeMap::new,
                        Collectors.counting()
                ));
    }
    /** 分级规则: <=3 优, 4-6 良, 7-10 一般, >10 差 */
    private String classify(int t) {
        if (t <= 3) return "优(≤3min)";
        if (t <= 6) return "良(4-6min)";
        if (t <= 10) return "一般(7-10min)";
        return "差(>10min)";
    }
    /** 打印报告 */
    public void printReport() {
        System.out.println("========= 慢跑恢复时间统计报告 =========");
        System.out.println("样本数量 : " + records.size());
        System.out.printf("平均时间 : %.2f 分钟%n", getAverage());
        System.out.printf("中位数   : %.1f 分钟%n", getMedian());
        System.out.println("最短时间 : " + getMin() + " 分钟");
        System.out.println("最长时间 : " + getMax() + " 分钟");
        System.out.printf("标准差   : %.2f%n", getStdDev());
        System.out.println("\n--- 恢复等级分布 ---");
        getLevelDistribution().forEach((k, v) ->
                System.out.printf("%-12s : %d 人 (%.1f%%)%n",
                        k, v, v * 100.0 / records.size()));
        System.out.println("=======================================");
    }
}

主程序 Main.java

package com.example.jogging;
import java.util.ArrayList;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        List<JoggingRecord> data = new ArrayList<>();
        data.add(new JoggingRecord("张三", 165, 68, 5, "2024-06-01"));
        data.add(new JoggingRecord("李四", 172, 70, 3, "2024-06-01"));
        data.add(new JoggingRecord("王五", 158, 65, 8, "2024-06-02"));
        data.add(new JoggingRecord("赵六", 180, 72, 12, "2024-06-02"));
        data.add(new JoggingRecord("孙七", 160, 66, 4, "2024-06-03"));
        data.add(new JoggingRecord("周八", 168, 69, 6, "2024-06-03"));
        data.add(new JoggingRecord("吴九", 175, 71, 9, "2024-06-04"));
        data.add(new JoggingRecord("郑十", 162, 67, 2, "2024-06-04"));
        System.out.println("--- 原始数据 ---");
        data.forEach(System.out::println);
        System.out.println();
        RecoveryAnalyzer analyzer = new RecoveryAnalyzer(data);
        analyzer.printReport();
    }
}

运行结果示例

--- 原始数据 ---
张三   | 峰值:165 | 静息:68  | 恢复:5 分钟 | 2024-06-01
李四   | 峰值:172 | 静息:70  | 恢复:3 分钟 | 2024-06-01
王五   | 峰值:158 | 静息:65  | 恢复:8 分钟 | 2024-06-02
赵六   | 峰值:180 | 静息:72  | 恢复:12 分钟 | 2024-06-02
孙七   | 峰值:160 | 静息:66  | 恢复:4 分钟 | 2024-06-03
周八   | 峰值:168 | 静息:69  | 恢复:6 分钟 | 2024-06-03
吴九   | 峰值:175 | 静息:71  | 恢复:9 分钟 | 2024-06-04
郑十   | 峰值:162 | 静息:67  | 恢复:2 分钟 | 2024-06-04
========= 慢跑恢复时间统计报告 =========
样本数量 : 8
平均时间 : 6.13 分钟
中位数   : 5.5 分钟
最短时间 : 2 分钟
最长时间 : 12 分钟
标准差   : 3.24
--- 恢复等级分布 ---
优(≤3min)     : 2 人 (25.0%)
良(4-6min)    : 3 人 (37.5%)
一般(7-10min) : 2 人 (25.0%)
差(>10min)    : 1 人 (12.5%)
=======================================

可扩展方向

扩展点 实现方式
数据读取 BufferedReader 从 CSV 文件读取记录
数据持久化 用 JDBC 存入 MySQL,方便查询历史
可视化 用 JFreeChart 绘制柱状图/折线图
趋势分析 按日期分组求均值,画恢复时间趋势线
实时提醒 若某次恢复时间 > 阈值,邮件/控制台告警
更精细的分级 结合年龄、最大心率储备(HRR)动态判定

关键设计说明

  1. 面向对象分层:实体类 JoggingRecord、分析类 RecoveryAnalyzer、启动类 Main,职责清晰。
  2. Stream APIaverage()min()max()groupingBy() 让统计代码简洁流畅。
  3. TreeMap 排序:等级分布输出天然有序(优→良→一般→差)。
  4. 可测试性RecoveryAnalyzer 与数据源解耦,便于单元测试和接口扩展。

如果你需要 CSV 版本Swing 图形界面版本数据库版,可以告诉我,我继续补充。

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