Попытка вычислить квартили, но получить java .lang.ArrayIndexOutOfBoundsException - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь вычислить три квартиля (верхний, средний и нижний) массива в java (Android Studio), но с кодом ниже я получаю эту ошибку: java.lang.ArrayIndexOutOfBoundsException: length=1; index=-1 в строке № 9. Это из-за какой-то операции, которую я пытаюсь сделать с переменной длины, но ошибочно. Также, если у кого-то есть лучшее решение или совет, как рассчитать верхний, средний и нижний квартили в массиве java, это было бы очень полезно.

static double getLQ(double[] val) {

    Arrays.sort(val);

    int length = val.length;
    double LQ = 0;

    if(length % 2 != 0) {
        LQ = val[length / 4] + val[length / 2 - 1] / 2;
    } else {
        LQ = val[length / 4];
    }

    return LQ;
}

Ответы [ 2 ]

1 голос
/ 28 марта 2020

Математически мы не можем найти квартили, когда число элементов меньше 4. Поэтому мы должны сначала рассмотреть этот случай. Другое дело, что индекс массива начинается с нуля, и нам нужно использовать скобки для расчета в соответствии с ожидаемым порядком. Тогда блок if-else будет таким, как показано ниже.

 if (length < 4) {
    LQ = 0;
 } else if(length % 2 != 0) {
    LQ = (val[(length / 4) - 1] + val[length / 4]) / 2;
 } else {
    LQ = val[(length / 4) - 1];
 }
1 голос
/ 27 марта 2020

Если есть только один элемент, то length / 2 разрешается до 0 (потому что оно сокращено до int), а length / 2 - 1 разрешается до -1. Индексация массива начинается с 0:

if (length == 1) {
    LQ = val[0];
} else if(length % 2 != 0) {
    LQ = val[length / 4] + val[length / 2 - 1] / 2;
} else {
    LQ = val[length / 4];
}

Также потребуется дополнительная проверка, не является ли массив пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...