簡體   English   中英

計算 java 中的平均值

[英]Calculate average in java

編輯:我已經為平均值編寫了代碼,但我不知道如何制作它,以便它也使用我的args.length而不是數組中的int s。

我需要編寫一個可以計算的 java 程序:

  1. 讀入的整數個數
  2. 平均值——不必是整數!

注意:我不想計算數組的平均值,而是計算args中的整數。

目前我已經寫了這個:

int count = 0;
for (int i = 0; i<args.length -1; ++i)
    count++;
    System.out.println(count);
}
    
int nums[] = new int[] { 23, 1, 5, 78, 22, 4};
double result = 0; //average will have decimal point
for(int i=0; i < nums.length; i++){
    result += nums[i];
}
System.out.println(result/count)

誰能指導我正確的方向? 或者舉一個例子來指導我以正確的方式塑造這段代碼?

提前致謝。

只需對您的代碼進行一些小的修改(為了清楚起見,對 var 進行了一些重命名):

double sum = 0; //average will have decimal point

for(int i=0; i < args.length; i++){
   //parse string to double, note that this might fail if you encounter a non-numeric string
   //Note that we could also do Integer.valueOf( args[i] ) but this is more flexible
   sum += Double.valueOf( args[i] ); 
}

double average = sum/args.length;

System.out.println(average );

請注意,循環也可以簡化:

for(String arg : args){
   sum += Double.valueOf( arg );
}

編輯:OP 似乎想使用args數組。 這似乎是一個字符串數組,因此相應地更新了答案。

更新

正如 zoxqoj 正確指出的那樣,上面的代碼沒有處理整數/雙溢出。 雖然我假設輸入值足夠小而不會出現這個問題,但這里有一個片段可用於非常大的輸入值:

BigDecimal sum = BigDecimal.ZERO;
for(String arg : args){
  sum = sum.add( new BigDecimal( arg ) );
}

這種方法有幾個優點(盡管速度有點慢,所以不要將它用於時間關鍵的操作):

  • 保持精度,使用 double 你會隨着數學運算的數量逐漸降低精度(或者根本無法獲得精確的精度,具體取決於數字)
  • 實際上消除了溢出的可能性。 但是請注意, BigDecimal可能比適合doublelong的更大。
int values[] = { 23, 1, 5, 78, 22, 4};

int sum = 0;
for (int i = 0; i < values.length; i++)
    sum += values[i];

double average = ((double) sum) / values.length;

這個

for (int i = 0; i<args.length -1; ++i)
    count++;

基本上再次計算args.length ,只是不正確(循環條件應該是i<args.length )。 為什么不直接使用args.length (或nums.length )呢?

否則你的代碼似乎沒問題。 雖然看起來您想從命令行讀取輸入,但不知道如何將其轉換為數字數組 - 這是您真正的問題嗎?

這似乎是舊線程,但 Java 從那時起已經發展並在 Java 8 中引入了 Streams 和 Lambdas。所以可能會幫助每個想要使用 ZD52387880E1EA22817A782D3759213 功能的人。

  • 在您的情況下,您希望將 String[] 的 args 轉換為 double 或 int。 您可以使用Arrays.stream(<arr>)來執行此操作。 一旦你有字符串數組元素的 stream ,你可以使用mapToDouble(s -> Double.parseDouble(s))它將 stream 的字符串轉換為 ZF7B44CFAFD5C52223D5498196C 的 ZF7B44CFAFD5C52223D5498196C
  • 如果你想自己控制增量計算,你可以使用Stream.collect(supplier, accumulator, combiner)來計算平均值。 這是一些很好的例子
  • 如果不想增量求平均值,可以直接使用Java的Collectors.averagingDouble()直接計算並返回平均值。 這里有一些例子

我將向您展示兩種方法。 如果您的項目中不需要大量統計信息,只需執行以下操作。

public double average(ArrayList<Double> x) {
    double sum = 0;
    for (double aX : x) sum += aX;
    return (sum / x.size());
}

如果您打算做很多統計數據,不妨不要重新發明輪子。 那么為什么不查看http://commons.apache.org/proper/commons-math/userguide/stat.html

你會陷入真正的愛!

public class MainTwo{
    public static void main(String[] arguments) {
        double[] Average = new double[5];
        Average[0] = 4;
        Average[1] = 5;
        Average[2] = 2;
        Average[3] = 4;
        Average[4] = 5;
        double sum = 0;
        if (Average.length > 0) {
            for (int x = 0; x < Average.length; x++) {
                sum+=Average[x];
                System.out.println(Average[x]);
            }
            System.out.println("Sum is " + sum);
            System.out.println("Average is " + sum/Average.length);
      }
   }
}
 System.out.println(result/count) 

您不能這樣做,因為 result/count 不是 String 類型,並且 System.out.println() 只接受 String 參數。 也許嘗試:

double avg = (double)result / (double)args.length

對於 1. 讀入的整數個數,您可以使用數組的長度屬性,如:

int count = args.length

它不給你數組中的元素。 和 2. 計算平均值:你正在以正確的方式做。

代替:

int count = 0;
for (int i = 0; i<args.length -1; ++i)
    count++;
System.out.println(count);

 }

你可以

int count = args.length;

平均值是 args 的總和除以 args 的數量。

int res = 0;
int count = args.lenght;

for (int a : args)
{
res += a;
}
res /= count;

您也可以使此代碼更短,我會讓您嘗試詢問您是否需要幫助!

這是我的第一個答案,如果有問題請告訴我!

如果您嘗試從命令行 args 獲取整數,則需要以下內容:

public static void main(String[] args) {
    int[] nums = new int[args.length];
    for(int i = 0; i < args.length; i++) {
        try {
            nums[i] = Integer.parseInt(args[i]);
        }
        catch(NumberFormatException nfe) {
            System.err.println("Invalid argument");
        }
    }

    // averaging code here
}

至於實際的平均代碼,其他人建議你如何調整它(所以我不會重復他們所說的)。

編輯:實際上最好把它放在上面的循環中而不使用nums數組

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM