You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java类中统计duration的总和、平均值、最小值与最大值?

统计duration的总和、平均值、最小值与最大值的实现方案

当然可以实现啦!你只需要把每次生成的duration值统一存储起来,之后就能轻松计算这些统计指标了。结合你的代码场景,我给你具体的实现步骤:

1. 先在类中定义存储duration的容器

因为你在同一类的不同方法里都用到了duration,所以在类的级别声明一个集合来保存所有的duration记录,比如:

// 用ArrayList存储,要是多线程环境就换成CopyOnWriteArrayList保证线程安全
private List<Long> durationRecords = new ArrayList<>();

2. 每次生成duration后存入集合

不管是在cleaningbay >=5的分支还是<5的分支,只要计算出duration,就把它加到集合里:

// 第一个分支(等待场景)
if (cleaningbay >=5) {
    long duration =5;
    durationRecords.add(duration); // 存入记录
    try {
        // 你的原有代码...
        System.out.println("\n\t All cleaners are busy..Please wait!..................................................................(-_-) " + bus.getName() );
        System.out.println("\n\t" + bus.getName() + " waited for " + duration );
        TimeUnit.SECONDS.sleep(duration);
        bus.notify();
        Cleaners(bus);
        bus.wait();
    } catch(InterruptedException iex) {
        iex.printStackTrace();
    }
} 
// 第二个分支(清洁场景)
else if (cleaningbay < 5) {
    // 你的原有代码...
    System.out.println("\n\t" + bus.getName() + " is heading to " + bus.getCleanersName() + Clock.get_time());
    cleaningbay++;
    long duration=0;
    try {
        System.out.println("\n\t Cleaning in progress :" + bus.getName() + Clock.get_time() );
        duration = (long)(Math.random()* 3);
        durationRecords.add(duration); // 存入记录
        TimeUnit.SECONDS.sleep(duration);
    } catch(InterruptedException iex) {
        iex.printStackTrace();
    }
}

3. 编写统计方法计算指标

写一个专门的方法来遍历集合,计算总和、平均值、最小值和最大值:

public void showDurationStats() {
    if (durationRecords.isEmpty()) {
        System.out.println("还没有任何duration记录哦");
        return;
    }

    long totalSum = 0;
    long minDuration = durationRecords.get(0);
    long maxDuration = durationRecords.get(0);

    for (long d : durationRecords) {
        totalSum += d;
        // 更新最小值
        if (d < minDuration) {
            minDuration = d;
        }
        // 更新最大值
        if (d > maxDuration) {
            maxDuration = d;
        }
    }

    double averageDuration = (double) totalSum / durationRecords.size();

    System.out.println("=== Duration统计结果 ===");
    System.out.println("总时长:" + totalSum + " 秒");
    System.out.println("平均时长:" + String.format("%.2f", averageDuration) + " 秒");
    System.out.println("最短时长:" + minDuration + " 秒");
    System.out.println("最长时长:" + maxDuration + " 秒");
}

注意事项:多线程环境的线程安全

从你的代码里的wait()和notify()来看,这应该是多线程场景,那要注意集合的线程安全问题:

  • 可以把ArrayList换成CopyOnWriteArrayList,它是线程安全的集合实现
  • 或者在添加元素的时候用synchronized块包裹,避免并发修改异常:
synchronized (this) {
    durationRecords.add(duration);
}

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:07:20