簡體   English   中英

計算數組中沒有最大值和最小值的平均值

[英]Calculating average without highest and lowest values in an array

因此,我正在嘗試計算數組的平均值和總和,但是在計算平均值/總和之前,必須刪除最高和最低值。

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

我不確定的是是否有一種方法可以減去最高和最低值,或者是否必須將數組中的數據復制到一個減去最高和最低值的新值中,然后計算平均值/總和。

到目前為止,這就是我所擁有的。 如果這很明顯,請原諒我,但是我很困惑,並且仍然在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();

像通常一樣計算總和,但要為最小值和最大值分別保留一個變量,最后將其減去:

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);

當然,您可能需要調整精確的方法以適合您所使用的類。

如果要計算值數組的平均值,並且不知道其中是否包含零。 我用了:

        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);
    }

為什么不使用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());
}

再次遍歷該數組,檢查每個元素是否等於raceantOneLow / High,如果不將其相加,則將其除以CompetitionantOne.length-2或僅是raceantOne.length。 那應該給你你的平均值。

我不明白為什么您需要從數組中刪除高值和低值以獲得平均值? 平均值應為所有值的總和除以值的總數:

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);

如上所述刪除值的問題是,如果您的數組的高點和低點不是唯一的(array [10、13、15、3、15、3、6] 15 =高,3 =低),則平均計算時不正確,因為它將忽略15s和3s。

我建議存儲高索引和低索引,並改用它。

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

暫無
暫無

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

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