如何在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
相关产品推荐
相关产品推荐

