[英]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.