我在寻找代码中的错误时遇到了麻烦,我必须计算每行的平均值,而不使用不符合条件的行,具体取决于排除的百分比,例如,在下面的示例中,我们有 9 行。如果我们排除 15%,则意味着我们必须丢弃第一行和最后一行。
int [][] m={// row average
{1,3,1,3}, //2
{5,6,7,8,9},// 7
{7},//7
{6,7,6,7},//6.5
{6,5,6,5},//5.5
{9,9},//9
{4,4,3,8,6},// 5
{400,4}, //202
{8,8,6,8,10}};//8
// average of row averages 28.0 (not adjusted)
// adjusted average depends on percentage excluded
这只是一个数组示例。
public static double adjustedAverage (int[][] m,int percentageExcluded){
double average[]= new double[m.length];
double excluded = m.length*percentageExcluded/100.;
double suma=0;
double cantidad=0;
double averageResult;
//creamos un array con las medias de cada fila
for (int fila=0; fila < m.length;fila++){
int rowTotales=0;
for (int columna=0; columna <m[fila].length;columna++){
rowTotales += m[fila][columna];
}
average[fila]= rowTotales / m[fila].length;
}
这部分我已经知道是正确的,我创建了一个新数组,其中包含每行的平均值。
//ordenamos el array
Arrays.sort(average);
在这一部分中,我命令数组排除最大和最低平均值
//Calculamos la nueva media excluyendo los que no cumplen las condiciones
for (int columna=0;columna < average.length;columna++){
if (columna>=excluded && columna<=average.length-(excluded)){suma=suma+average[columna];
cantidad++;}
}
averageResult = suma/cantidad;
System.out.println("La mediana ajustada es"+averageResult);
return averageResult;
在上面的示例中,百分比排除为 15 %,结果必须是 6.8,但我的程序打印出 7。知道我失败在哪里吗?
最佳答案
嗯,你实际上有两个问题。
您的主要问题是 Java 在处理原语时的行为。我的建议是在 int 和 double 之间进行数学运算之前,始终将每个 int 转换为 double 。如果您的方程中只有整数并且期望结果为 double ,那么这也是必要的!
请查看您的代码。我已经添加了缺少的类型转换。
解决了这个问题就会导致第二个问题。因为启动此代码表明,您丢弃了 9 行中的 3 行,而不是 9 行中的 2 行。您必须调整方式以删除正确数量的行,具体取决于您在描述中提到的百分比。
只需按原样运行代码并查看控制台中的输出即可。您期望总和为 48,但实际只有 43。
祝你好运! ;)
public static void main (String args[])
{
int [][] m={// row average
{1,3,1,3}, //2
{5,6,7,8,9},// 7
{7},//7
{6,7,6,7},//6.5
{6,5,6,5},//5.5
{9,9},//9
{4,4,3,8,6},// 5
{400,4}, //202
{8,8,6,8,10}};//8
adjustedAverage(m, 15);
}
public static double adjustedAverage (int[][] m,int percentageExcluded){
double average[]= new double[m.length];
double excluded = ((double)m.length * (double)percentageExcluded) / 100.00; // <<<<< cast int to double
double suma=0;
double cantidad=0;
double averageResult;
// <<<<< the value of excluded (just for debugging purposes)
System.out.println("excluded: " + excluded);
//creamos un array con las medias de cada fila
for (int fila=0; fila < m.length;fila++){
double rowTotales = 0;
for (int columna=0; columna <m[fila].length;columna++){
rowTotales += (double)m[fila][columna]; // <<<<<< cast int to double
}
average[fila]= rowTotales / (double)m[fila].length; // <<<<<< cast int to double
}
//ordenamos el array
Arrays.sort(average);
// the list of averages (just for debugging purposes)
System.out.println("List of averages: ");
for(int i=0; i<average.length; i++)
{
System.out.println(average[i]);
}
//Calculamos la nueva media excluyendo los que no cumplen las condiciones
for (int columna=0;columna < average.length;columna++){
if (columna>=excluded && (columna<=average.length-excluded))
{
// <<<<< every relevant average (just for debugging purposes)
System.out.println("relevant average for 'suma': " + average[columna]);
suma += average[columna];
cantidad++;
}
}
// <<<<< the sum of all relevant averages (just for debugging purposes)
System.out.println("Suma: " + suma);
averageResult = suma/cantidad;
System.out.println("La mediana ajustada es " + averageResult);
return averageResult;
}
关于Java调整数组中的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41968385/