繁体   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