首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java 陣列統計實戰:計算平均值、最大值、最小值的正確姿勢

     編輯:Java 程式設計入門

問題分析

原始代碼存在嚴重邏輯錯誤:

  • 平均值計算錯誤:`s += w[i]/5` 應為累加後再除
  • 最大/最小值判斷錯誤:迴圈內比較固定索引 `w[0]`、`w[2]` 而非 `w[i]`
  • 整數除法精度丟失:`int s` 存儲平均值會截斷小數

修正版實現(Java 7 風格)

package com.example.array;

public class ArrayStatistics {
    public static void main(String[] args) {
        // 模擬學生 Java 成績
        double[] scores = {34.0, 24.0, 78.0, 99.0, 100.0};
        
        if (scores.length == 0) {
            System.out.println("陣列為空");
            return;
        }
        
        double sum = 0;
        double max = scores[0];
        double min = scores[0];
        
        for (double score : scores) {
            sum += score;
            if (score > max) max = score;
            if (score < min) min = score;
        }
        
        double avg = sum / scores.length;
        
        System.out.printf("平均分:%.2f%n", avg);
        System.out.println("最高分:" + max);
        System.out.println("最低分:" + min);
    }
}

現代 Java 8+ Stream API 寫法(推薦)

import java.util.Arrays;
import java.util.OptionalDouble;

public class ArrayStatisticsModern {
    public static void main(String[] args) {
        double[] scores = {34.0, 24.0, 78.0, 99.0, 100.0};
        
        // 並行流處理大數據量更高效
        OptionalDouble avgOpt = Arrays.stream(scores).average();
        OptionalDouble maxOpt = Arrays.stream(scores).max();
        OptionalDouble minOpt = Arrays.stream(scores).min();
        
        if (avgOpt.isPresent()) {
            System.out.printf("平均分:%.2f%n", avgOpt.getAsDouble());
            System.out.println("最高分:" + maxOpt.getAsDouble());
            System.out.println("最低分:" + minOpt.getAsDouble());
        }
        
        // 一次性獲取所有統計量(最高效)
        DoubleSummaryStatistics stats = Arrays.stream(scores)
            .collect(Collectors.summarizingDouble(d -> d));
        
        System.out.printf("平均:%.2f, 最大:%.2f, 最小:%.2f, 總和:%.2f, 個數:%d%n",
            stats.getAverage(), stats.getMax(), stats.getMin(), stats.getSum(), stats.getCount());
    }
}

物件陣列統計(對應原始代碼場景)

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

class Student {
    private String name;
    private double javaScore;
    
    public Student(String name, double javaScore) {
        this.name = name;
        this.javaScore = javaScore;
    }
    // getter 省略
    public double getJavaScore() { return javaScore; }
    public String getName() { return name; }
}

public class StudentScoreStats {
    public static void main(String[] args) {
        List students = List.of(
            new Student("張揚", 34),
            new Student("劉禪", 24),
            new Student("張燕", 78),
            new Student("周少博", 99),
            new Student("張旭", 100)
        );
        
        // 方式一:Stream 統計
        DoubleSummaryStatistics stats = students.stream()
            .collect(Collectors.summarizingDouble(Student::getJavaScore));
        
        System.out.printf("平均分:%.2f%n", stats.getAverage());
        System.out.println("最高分:" + stats.getMax() + " (" + 
            students.stream().max(Comparator.comparing(Student::getJavaScore)).get().getName() + ")");
        System.out.println("最低分:" + stats.getMin() + " (" + 
            students.stream().min(Comparator.comparing(Student::getJavaScore)).get().getName() + ")");
        
        // 方式二:並行處理大量數據
        // students.parallelStream().collect(...)
    }
}

效能對比與選型建議

方案適用場景優點缺點
for 迴圈極簡場景、嵌入式、Android 老版本零開銷、完全控制樣板代碼多、易出錯
Stream API現代 Java 應用、業務邏輯可讀性強、函數式、並行友好微小開銷、調試稍難
DoubleSummaryStatistics需多統計量同時獲取單次遍歷、數值穩定算法僅限基本型別流
Apache Commons Math科學計算、統計分析豐富統計函數引入重依賴

避坑檢查清單

  1. 空陣列防禦:先判 `length == 0` 或 `isEmpty()`
  2. 初始值正確:max/min 初始化為 `array[0]`,而非 0 或常數
  3. 精度保持:累加用 `double`/`BigDecimal`,最後再除
  4. 並發安全:多執行緒寫入陣列需同步或用 `CopyOnWriteArrayList`
  5. NaN/Infinity:科學計算時檢查 `Double.isNaN()`、`Double.isInfinite()`

總結

陣列統計看似簡單,實則暗藏邏輯錯誤與精度陷阱。現代 Java 開發首選 DoubleSummaryStatistics 或 Stream API,既消除了手寫迴圈的低級錯誤,又提供了並行處理與數值穩定性保障。記住:不要重複造輪子,標準庫已經幫你處理好邊界情況。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved