有人可以帮助解释为什么我不能显示正确的中位数吗? [Java]
Can someone help explain why I can't display a proper median? [Java]
所以我正在制作的程序应该能够确定平均值、中位数以及有多少 "grades" 已被放入程序中。尝试显示中位数并且没有任何错误使用我猜是一种找到中位数的流行方法(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
作为数组的 "length" 计算中位数,而不是原始数组的完整(静态)长度。
编辑:
...另外,我刚刚注意到您的 sort
超过了整个数组(因此所有 25 个索引)。这也可能会导致问题,因为它会将 "empty" 索引(实际上具有默认值 0.0)视为要排序的元素的一部分。用类似的方法解决这个问题。仅对数组中实际具有您输入的成绩的部分进行排序——即使用 this method signature 代替。例如
Array.sort(gradeArray, 0, gradeCount);
第二次编辑:
第三个问题(我认为不相关,但仍然很重要)是行 if (boxInput >= 0)
应该改为 if (gradeCount < 25)
。 ...假设此行旨在执行注释所说的操作:"makes the check for how many grades are entered".
所以我正在制作的程序应该能够确定平均值、中位数以及有多少 "grades" 已被放入程序中。尝试显示中位数并且没有任何错误使用我猜是一种找到中位数的流行方法(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
作为数组的 "length" 计算中位数,而不是原始数组的完整(静态)长度。
编辑:
...另外,我刚刚注意到您的 sort
超过了整个数组(因此所有 25 个索引)。这也可能会导致问题,因为它会将 "empty" 索引(实际上具有默认值 0.0)视为要排序的元素的一部分。用类似的方法解决这个问题。仅对数组中实际具有您输入的成绩的部分进行排序——即使用 this method signature 代替。例如
Array.sort(gradeArray, 0, gradeCount);
第二次编辑:
第三个问题(我认为不相关,但仍然很重要)是行 if (boxInput >= 0)
应该改为 if (gradeCount < 25)
。 ...假设此行旨在执行注释所说的操作:"makes the check for how many grades are entered".