2012-08-17 131 views
6

我有一個家庭作業的任務,我想知道是否有人可以幫助我,因爲我是新來的Java和編程,並堅持一個問題。問題是:如何操作數組。找到平均值。初學者Java

第一種方法找到一個整數數組的元素的平均:

public double average(int[] data) 

即,給定一個整數數組,數據,計算出其元件的平均是返回的平均值。例如,{1,3,2,5,8}的平均值是3.8。

這是我迄今所做的:

public double average(int[] data) { 
    int sum = 0; 

    while(int i=0; i < data.length; i++) 

    sum = sum + data[i]; 
    double average = sum/data.length;; 

    System.out.println("Average value of array element is " " + average); 
} 

當編譯它,我就到int i=0部分的錯誤信息,說「的.class預期」。任何幫助,將不勝感激。

+0

u能張貼滿級? – 2012-08-17 08:30:51

+2

@DanglingPiyush不需要。問題很明顯。 – 2012-08-17 08:31:31

+2

你的空白是相當具有誤導性的。爲了清晰起見,在/ while循環中使用大括號通常被認爲是很好的做法,而現在你所擁有的是誤導性的。看到[這個pastebin](http://pastebin.com/HLpFv8zw)爲我的意思的例子。 – 2012-08-17 08:34:31

回答

4
-while(int i=0; i < data.length; i++) 
+for(int i=0; i < data.length; i++) 
+0

LOL。怎麼沒有人注意到這一點? – RAY 2012-08-17 08:48:37

+0

@RAY它是統一差異格式的一部分http://en.wikipedia.org/wiki/Diff#Unified_format – CyberDem0n 2012-08-17 08:51:25

+0

我知道。有趣的是,似乎沒有人注意到如此明顯的事物。 – RAY 2012-08-17 09:39:06

13

使用增強的話會更好:

int sum = 0; 
for (int d : data) sum += d; 

,可能會給你一個巨大的驚喜另一件事情是錯誤的結果,你會從

double average = sum/data.length; 

原因獲得:在右邊你有整數除法,Java不會自動將它提升爲浮點除法。它將計算sum/data.length的整數商,然後只將該整數提升到double。的溶液。將

double average = 1.0d * sum/data.length; 

這將迫使股息成double,這將自動地傳播到除數。

+1

通過最初將'sum'指定爲'double',可以解決整數除法問題;或者通過明確地轉換分界線上的任一參數,例如, 'double average =((double)sum)/ data.length;' – 2012-08-17 08:36:01

+1

@AndrzejDoyle我不會推薦'double sum'作爲一般解決方案,因爲它會導致整數超過2^54的精度損失(或者是2^56?)。無論如何,這是一個相當大的數字,但仍然,爲什麼當有更清潔的選擇時。 – 2012-08-17 08:38:58

+0

同意,在劃分之前轉換是「正確」的方式。 (我認爲在你的例子中,我想添加括號,以明確它被評估爲'(1.0d * sum)/ data.length'而不是'1.0d *(sum/data.length)',因爲後者仍然是錯的,我意識到,即使沒有括號,Java也會採用前一種方法,但括號是一種文檔,可以消除某人閱讀的任何疑問,有點像標記變量'final',即使他們從不) – 2012-08-17 08:44:32

0
for(int i=0; i < data.length; i++) 
{ 
    sum = sum + data[i]; 
} 

or 

int i=0; 
while(i < data.length) 
{ 
    sum = sum + data[i]; 
    i++; 
} 
-1

兩個問題:

while應該是一個for 你沒有返回值,但你已經宣佈雙

double average = sum/data.length;; 

總和data.length的返回類型這兩個整數,所以該科將返回一個int - 檢查您的類型

雙分號,可能不會打破它,看起來很奇怪。

0

嘗試這種方式

public void average(int[] data) { 
    int sum = 0; 
    double average; 

    for(int i=0; i < data.length; i++){ 
     sum = sum + data[i]; 
    } 
    average = (double)sum/data.length; 
    System.out.println("Average value of array element is " + average);  
} 

,如果你需要返回平均值,你需要使用代替無效關鍵字的關鍵字和需要返回值返回平均

public double average(int[] data) { 
    int sum = 0; 
    double average; 

    for(int i=0; i < data.length; i++){ 
     sum = sum + data[i]; 
    } 
    average = (double)sum/data.length; 
    return average;  
} 
-1

如果我們想增加一個陣列的數量,並發現他們的平均遵循這一簡單的方法! .....

public class Array { 

    public static void main(String[] args) { 

     int[]array = {1,3,5,7,9,6,3}; 
     int i=0; 
     int sum=0; 
     double average=0; 
     for(i=0;i<array.length;i++){ 
      System.out.println(array[i]); 
      sum=sum+array[i]; 
     } 
     System.out.println("sum is:"+sum); 
     System.out.println("average is: "+(double)sum/vargu.length); 



    } 

} 
+0

vargu從哪裏來?爲什麼你要聲明一個變量平均值而不使用它?爲什麼你要在循環之外聲明fori循環迭代變量? – skubski 2017-10-05 12:00:53

0
找到一些數字的平均值

最好的辦法是設法 ......

public static void main(String[] args) { 
    average(1,2,5,4); 

} 

public static void average(int...numbers){ 
    int total = 0; 
    for(int x: numbers){ 
     total+=x; 
    } 
    System.out.println("Average is: "+(double)total/numbers.length); 

} 
0

好了,來計算陣列的平均值,則可以考慮使用for循環而不是while循環。

所以按照你的問題讓我假設數組作爲arrNumbers(在這裏我考慮相同的數組元素在你的問題)

int arrNumbers[] = new int[]{1, 3, 2, 5, 8}; 
int sum = 0; 

for(int a = 0; a < arrNumbers.length; a++) 
{ 
    sum = sum + arrNumbers[a]; 
} 

double average = sum/arrNumbers.length; 

System.out.println("Average is: " + average); 

您可以使用scanner類爲好。這是留給你的。

4

Java的8流API提供了一個優雅的選擇:

public static void main(String[] args) { 
    double avg = Arrays.stream(new int[]{1,3,2,5,8}).average().getAsDouble(); 

    System.out.println("avg: " + avg); 
}