繁体   English   中英

有人可以帮我解释为什么我不能显示适当的中位数吗? 【JAVA]

[英]Can someone help explain why I can't display a proper median? [Java]

因此,我正在编写的程序应该能够确定均值,中位数以及已放入程序中的“等级”数。 尝试使用显示中位数而不显示任何错误,我猜这是找到中位数的一种流行方法(Google认为这是找到中位数的好主意)。 当我输入数字时,我总是得到0.0,直到我将数组最大化(设置为25),然后变为1.0。 仍然没有真正做它应该做的任何数学运算。

  DecimalFormat df = new DecimalFormat ("#0.0##");
   String textBoxInputStr;
   String gCountStr;
   double boxInput = 0;
   double[]gradeArray = new double[25];
   int gradeCount = 0;
   double mean = 0;
   String meanStr;
   double sum = 0;
   double median = 0;
   String medianStr;
   do {    
      try {
         if(gradeCount < 25) {
             textBoxInputStr = JOptionPane.showInputDialog(this,"Enter Grade","Enter Grade", JOptionPane.PLAIN_MESSAGE);  //makes texbox

             boxInput = Double.parseDouble(textBoxInputStr);                //parses what goes on in the textbox

             gradeArray[gradeCount] = boxInput;                           //puts the parsed data into the array 
             gradeCount++;                                                //is the tracker for how many grades are entered
             gCountStr = Integer.toString(gradeCount);                    //converts the counter to string
             txtGrades.setText(gCountStr);                                //places the newly converted counter into grades box for display
          }
         else      //an error
             {      
            JOptionPane.showInputDialog(this,"You can only input 25 values","Too Much Data", JOptionPane.PLAIN_MESSAGE); 
             }
     //(Above) this is all to keep track of how many grades are entered and all the grades are stored in the array.
     //start of median stuff
     Arrays.sort(gradeArray, 0, gradeCount);
  if (gradeCount % 2 == 0) {
      median = ((double)gradeArray[gradeCount/2] + (double)gradeArray[gradeCount/2 - 1])/2;
     medianStr = Double.toString(median);
      txtMedian.setText(medianStr);
  }
  else {
       median = (double) gradeArray[gradeCount/2];
       medianStr = Double.toString(median);
      txtMedian.setText(medianStr);
  }
         //start of the average
               for (double i : gradeArray){
                   sum += i;
               }
               mean = sum / gradeCount;
               meanStr = Double.toString(mean);
               txtMean.setText(meanStr);

       }
     catch(NumberFormatException | HeadlessException e)  //catches bad data
                  {
                  JOptionPane.showMessageDialog(this, "Your input must be numeric!", "Bad Data!", JOptionPane.ERROR_MESSAGE);
                  }
     }
     while(gradeCount <= 25);

      }                                       

两个问题。

首先,您的do-while循环缺少括号来表示主体。 (这是您的原始代码吗?还是仅是您在此处发布的内容?)

其次,您将gradeArray声明为原始数组,但使用其长度来计算每次迭代的更新中位数。 基本数组的长度从实例化之时起就不会改变-它不依赖于添加了多少个元素。 换句话说, gradeArray.length始终为25(在您的示例中),无论您实际使用成绩填充了多少索引。

要解决第一个问题,只需在do之后和while之前的所有内容之间添加括号。

要解决第二个问题,您应该使用gradeCount作为数组的“长度”,而不是原始数组的完整(静态)长度来计算中位数。


编辑:

...此外,我只是注意到您的sort遍及整个数组(因此所有25个索引)。 这也可能会引起问题,因为它将“空”索引(实际上默认值为0.0)作为要排序元素的一部分。 以类似方式解决此问题。 仅对数组中实际具有您输入的成绩的部分进行排序-即使用此方法签名 例如

Array.sort(gradeArray, 0, gradeCount);

第二编辑:

第三个问题(我认为这无关紧要,但仍然很重要,要解决)是if (boxInput >= 0)应该是if (gradeCount < 25) ……假设此行旨在按照注释中的说明进行操作:“检查输入了多少个成绩”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM