Если у меня есть двойной массив вроде этого:
[0.0,12.0.0,0.0,0.0,0.0,6.0,5.0,0.0]
и я бы посчитал среднее значение только не числа 0.0, почему этот код не работает нормально?
public static double Average(double[] myarray) throws IllegalArgumentException {
double dValue = 0.0;
int counter=1;
if (myarray== null) {
throw new IllegalArgumentException("The array must be defined or diferent to null");
}
if (myarray.length == 0) {
throw new IllegalArgumentException("The array must have size greater than zero");
}
for(int i = 0 ; i < myarray.length ; i++) {
if (myarray[i] > 0.0){
counter++;
dValue += myarray[i]/counter;
}
}
return dValue;
}
Делить на counter
после цикла, а не в нем.
На самом деле вам придется всегда делить на конечное значение счетчика минус один (а не на увеличивающееся значение), что невозможно во время цикла.
@DoctorWho Имеется ввиду for
-loop, if
не определяет цикл
Причина в том, что ваш счетчик увеличивается во время цикла, поэтому ваше среднее значение всегда неверно, потому что каждое число не делится на один и тот же счетчик.
Потому что ты из этой линии
dValue += myarray[i]/counter;
ты должен заставить тебя зацикливаться
for(int i = 0 ; i < myarray.length ; i++) {
if (myarray[i] > 0.0){
counter++;
dValue += myarray[i];
}
}
dValue = dValue / counter;
Дополнительный счетчик должен быть инициализирован нулем. Таким образом, вы должны добавить проверку перед последней строкой.
if (counter == 0){
// Handle Divide by Zero Exception
return 0;
}
return dValue / counter;
Это обычно очень важно, поскольку, например, когда ваш массив имеет 1 элемент, вы вернете значение этого элемента, деленное на 2, а не на 1
Вы делите счетчиком на каждой итерации, что не даст вам среднего значения. Вам нужно разделить на последнее число счетчика, как только у вас будет общая сумма.
Просто сделай это:
public static double Average(double[] myarray) throws IllegalArgumentException {
double dValue = 0.0;
int counter=1;
if (myarray== null) {
throw new IllegalArgumentException("The array must be defined or diferent to null");
}
if (myarray.length == 0) {
throw new IllegalArgumentException("The array must have size greater than zero");
}
for(int i = 0 ; i < myarray.length ; i++) {
if (myarray[i] > 0.0){
counter++;
dValue += myarray[i];
}
}
return dValue/counter;
}
Вы имеете в виду выход из цикла "если"?