【问题标题】:Calculating average without highest and lowest values in an array计算数组中没有最高值和最低值的平均值
【发布时间】:2016-11-21 11:44:54
【问题描述】:

所以我正在尝试计算数组的平均值和总和,但是我必须先删除最高和最低值,然后才能计算平均/总和。

我有代码用随机双精度数填充数组,然后找到最大值和最小值。

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

这是我目前所拥有的。如果这有点明显,请原谅我,但我被难住了,并且仍然在介绍 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();

【问题讨论】:

  • 要格式化您的代码,请将其粘贴到编辑器中,如果全部选择,然后使用{} 按钮将其转换为代码块。并在提交之前查看预览
  • 请不要写那么多 syso println,在你的一个 syso "\n\n" 中写入换行符......而且你的 for 循环不完整(for (int index=1; index . ...?)
  • 是的,print/printlns 太多了。无需将空格作为附加字符串。至少,您应该将 S.o.p 设置为 println 并且只有一个额外的空白,最好像 Martinl 所说的那样,在末尾添加 +"\n\n" ,但最好的办法是使其成为 @987654324 @s:S.o.pf("message %f%n%n", value);.

标签: java arrays average


【解决方案1】:

像往常一样计算总和,但为最小值和最大值分别保留一个变量,最后减去它们:

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

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

【讨论】:

  • List代替数组和Collections.min/Collections.max:ideone.com/4EJjr几乎相同
【解决方案2】:

我不明白你为什么需要从数组中删除高低值来获得平均值?平均值应该是所有值的总和除以值的总数:

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 = High, 3 = Low) 那么当你计算它时,你的平均值会不正确,因为它会忽略 15 秒和 3 秒。

我建议存储高索引和低索引并使用它。

【讨论】:

  • 谢谢,这对我有用。我需要删除最高和最低,因为随机双打是“评委分数”,它用于程序来确定比赛的获胜者。
【解决方案3】:

再次遍历数组,检查每个元素是否等于竞争者OneLow/High,如果它没有被添加到计数中,当你将它除以竞争者One.length - 2 或只是竞争者One.length。这应该会给你你的平均值。

【讨论】:

    【解决方案4】:
    Arrays.sort(a);
    find sum of array a
    sum -= a[0] + a[a.length - 1]
    return sum / (a.length - 2)
    

    【讨论】:

      【解决方案5】:

      如果您要计算一组值的平均值,并且您不知道其中是否会有零。 我用过:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2019-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多