2011-11-06 85 views
0

所以我試圖計算一個數組的平均值和總和,但是我必須在計算平均值/總和之前除去最高和最低值。計算陣列中沒有最高和最低值的平均值

我有代碼用隨機雙打填充數組,然後找到最高和最低值。

我不確定的是,如果有一種方法來減去最高和最低值,或者如果我不得不將數據從數組中複製到新數據減去最高和最低值,然後計算平均值/和。

這是我到目前爲止。原諒我,如果這有點明顯,但我很難過,仍然在java課程介紹。

這是我的代碼到目前爲止。

double [] contestantOne = new double[8]; 

for (int index=0; index < contestantOne.length; index++) { 
    contestantOne [index] = (double) (Math.random()*9) + 1; 
} 

for (int index=0; index < contestantOne.length; index++) { 
    System.out.println(contestantOne [index] + "\n"); 
} 

double contestantOneHigh; contestantOneHigh = contestantOne[0]; 

for (int index=1; index <contestantOne.length; index++) {  
    if (contestantOne[index] > contestantOneHigh) 
     contestantOneHigh = contestantOne[index]; 
} 

System.out.print("The highest value in your array is" 
       + " " + contestantOneHigh); 
System.out.println(); 
System.out.println(); 

double contestantOneLow; contestantOneLow = contestantOne[0]; 
for (int index=1; index<contestantOne.length; index++) { 

    if (contestantOne [index] < contestantOneLow) 
     contestantOneLow = contestantOne[index]; 
}  

System.out.print("The lowest value in your array is" 
       + " " + contestantOneLow); 
System.out.println(); 
System.out.println(); 
+1

要格式化您的代碼,請將其粘貼到編輯器中,選擇是否全部,然後使用「{}」按鈕將其轉換爲代碼塊。 **在提交之前查看預覽**。 – Mat

+0

請不要寫這麼多syso println,寫入你的一個syso「\ n \ n」換行符...並且你的for循環不完整(for(int index = 1; index ....?) – MartinL

+0

是,print/println是過度的,沒有必要把空間作爲一個額外的字符串,至少你應該讓Sopa println,只有一個額外的空白,最好像Martinl說的那樣,最後加+「\ n \ n」,但最好的辦法是使它成爲'printf's:'Sopf(「message %f%n%n「,value);'。 – Kevin

回答

0

我不明白你爲什麼需要從數組中去掉高低值來得到平均值?平均應該是通過值的總數除以所有值的總和:

double sum = 0; 
for (int index=0; index < contestantOne.length; index++) 
{ 
    //If you really need to remove highest and lowest value 
    if (contestantOne[index] != contestantOneLow && contestantOne[index] != contestantOneHigh) 
     sum += contestantOne[i]; 
} 
double avg = sum/(double)(contestantOne.length - 2); 

與如上完成去除的值的問題是如果您的陣列高點和低點不是唯一的(陣列[10, 13,15,3,15,3,6] 15 =高,3 =低),那麼當你計算它時,你的平均值將是不正確的,因爲它將忽略15s和3s。

我建議存儲高指數和低指數,然後使用它。

+0

謝謝,這對我有用。我需要刪除最高和最低,因爲隨機雙打是「裁判分數」,也是一個確定比賽獲勝者的計劃。 – Autosuggestion

0

遍歷數組再次檢查,如果每個元素等於contestantOneLow /高,如果它不添加來算,當您通過contestantOne.length做除法這一點 - 2或只是contestantOne.length。這應該給你你的平均。

3

計算總和像往常一樣,但要保持變量分別用於最小值和最大值,減去出來結尾:

double min, max, sum; 
min = max = sum = list[0]; // May want to add a check to make sure length > 1 
for(int i = 1; i < list.length; i++) { 
    double thisValue = list[i]; 
    sum += thisValue; 
    min = Math.min(min, thisValue); 
    max = Math.max(max, thisValue); 
} 
sum -= min + max; 
double avg = sum/(list.length - 2); 

當然,你可能需要調整精確的方法,以適應你正在使用的課程。

+0

與一些'List'而不是數組和'Collections.min' /'Collections.max'幾乎相同:http://ideone.com/4EJjr – 2011-11-06 18:15:44

0
Arrays.sort(a); 
find sum of array a 
sum -= a[0] + a[a.length - 1] 
return sum/(a.length - 2) 
0

如果您要計算值數組的平均值,並且您不知道是否將零中有零。 我使用過:

 int[] arrayDays = new int[] {monday,tuesday,wednesday,thursday,friday,saturday,sunday}; 
    int totalValue = 0; 
    int divide = 0; 

    for (int i=0;i<arrayDays.length;i++){ 
     if (arrayDays[i] != 0){ 
      totalValue = totalValue + arrayDays[i]; 
      divide = divide+1; 
     } 
    } 
    Float average = 0f; 
    if (divide!=0){ 
     average = Float.valueOf(totalValue/divide); 
    } 
0

爲什麼不使用TreeSet而不是數組?這樣,元素將被排序,並且您將能夠使用O(1)複雜度移除更高和最低元素,而不是遍歷整個數組。

你只需要通過收集來完成總和,就這些了。您的整個程序將在O(logn)+ O(n)時間運行。

public static void main(String[] args) { 
    TreeSet<Double> contestantOne = new TreeSet<>(); 

    for (int index=0; index < 8; index++) { 
     contestantOne.add((double) (Math.random()*9) + 1); 
    } 

    Iterator<Double> iterator = contestantOne.iterator(); 
    while(iterator.hasNext()){ 
     System.out.println(iterator.next()); 
    } 

    double contestantOneHigh = contestantOne.pollLast(); 

    System.out.print("The highest value in your array is" 
        + " " + contestantOneHigh); 


    double contestantOneLow = contestantOne.pollFirst(); 

    System.out.println("The lowest value in your array is" 
        + " " + contestantOneLow); 

    double sum = 0.0; 
    iterator = contestantOne.iterator(); 

    while(iterator.hasNext()){ 
     sum += iterator.next(); 
    } 

    System.out.println("The sum excluding first and last is: " + sum); 
    System.out.println("The average excluding first and last is: " + sum/contestantOne.size()); 
} 
相關問題