Как найти ненулевое число в двойном массиве?

Если у меня есть двойной массив вроде этого:

[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;
    }
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
58
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Делить на counter после цикла, а не в нем.

На самом деле вам придется всегда делить на конечное значение счетчика минус один (а не на увеличивающееся значение), что невозможно во время цикла.

Вы имеете в виду выход из цикла "если"?

DoctorWho 13.09.2018 17:12

@DoctorWho Имеется ввиду for-loop, if не определяет цикл

Michael Butscher 13.09.2018 17:12

Причина в том, что ваш счетчик увеличивается во время цикла, поэтому ваше среднее значение всегда неверно, потому что каждое число не делится на один и тот же счетчик.

Потому что ты из этой линии

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;
}

Другие вопросы по теме