计算数组中没有最高值和最低值的平均值

时间:2011-11-06 17:49:40

标签: java arrays average

所以我试图计算一个数组的平均值和总和,但是在计算平均值/总和之前我必须删除最高值和最低值。

我有代码用随机双打填充数组,然后找到最高和最低值。

我不确定的是,是否有办法减去最高值和最低值,或者我是否必须将数据中的数据复制到新的数据中减去最高值和最低值,然后计算平均值/总和。

这是我到目前为止所拥有的。请原谅我,如果这有点明显,但我很难过,仍然在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();

6 个答案:

答案 0 :(得分: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);

当然,您可能需要调整精确的方法以适合您正在使用的课程。

答案 1 :(得分:0)

再次遍历数组,检查每个元素是否等于contestantOneLow / High,如果它没有添加到count,当你把它除以contestantOne.length - 2或者只是contestantOne.length。应该给你平均值。

答案 2 :(得分: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 =低)那么计算它时你的平均值是不正确的,因为它会忽略15和3。

我建议存储高和低索引的索引,然后使用它。

答案 3 :(得分:0)

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

答案 4 :(得分: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);
    }

答案 5 :(得分: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());
}