有人可以帮助解释为什么我无法显示正确的中位数吗? 【JAVA]

时间:2016-12-06 03:24:59

标签: java median

所以我正在制作的节目应该能够确定平均值,中位数以及多少"等级"已被纳入该计划。试图获得中位数显示并没有任何错误使用我猜一个流行的方式找到中位数(谷歌认为它是如何找到中位数的好主意)。当我输入一个数字时,我总是得到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);

      }                                       

1 个答案:

答案 0 :(得分:2)

两个问题。

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

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

要解决第一个问题,只需在do之后和while之前添加大括号。

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

编辑:

...另外,我刚注意到你的sort超过了整个数组(因此所有25个索引)。这也可能导致问题,因为它会将“空”索引(实际上具有默认值0.0)视为要排序的元素的一部分。以类似的方式解决此问题。只对实际具有您输入成绩的数组部分进行排序 - 即。请改用this method signature。 E.g。

Array.sort(gradeArray, 0, gradeCount);

第二次编辑:

第三个问题(我认为不相关,但仍然很重要)是if (boxInput >= 0)行应该是if (gradeCount < 25)。 ......假设这一行是为了做评论所说的那样:“检查输入了多少等级。”