Расчет режима - PullRequest
       4

Расчет режима

0 голосов
/ 10 апреля 2020

Я пытаюсь написать метод, который будет вычислять режим набора данных и возвращать его. Если нет режима или более одного режима (например: если 4 & 2 вернул наибольшее количество раз), я хочу, чтобы функция возвращала Double.NaN. Я смог получить режим, но у меня возникли проблемы с возвращением моего кода Double NaN, если существует более одного режима.

Вот мой код!

public double mode() {

    if (data == null) {
        double mode;
        mode = Double.NaN;
        return mode; // returns no value if array is null
    }

    double mode = 0;
    double modeCounter = 0;

    for (int c = 0; c < data.length; ++c) {
        int count = 0;
        for (int i = 0; i < data.length; ++i) {
            if (data[i] == data[i])
                ++count;
        }
        if (count > modeCounter) {
            modeCounter = count;
            mode = data[c];
        }
    }
    if (!(modeCounter > 1)) {
        return Double.NaN;
    }

    return mode;

}

1 Ответ

0 голосов
/ 10 апреля 2020

Я предполагаю, что вы используете Java.

Мы можем найти режим (наряду с ограничениями, которые вы устанавливаете для возврата Double.NaN), просто создав Map, в котором ключи являются отдельные точки данных и их значения соответствуют их количеству в массиве данных.

Stream s будет излишне полезно для написания читаемого и краткого кода.

Если у вас есть счетчик каждого члена в вашем array / ArrayList, вы можете просто использовать этот счетчик, чтобы сделать выводы на основе вашего требования.

См. следующий код, который реализует приведенное выше объяснение:

public static Double mode(List<Double> data) {
    if (data.isEmpty()) {
        // returning NaN if the input arraylist is empty 
        return Double.NaN;
    }

    Map<Double, Integer> count = new HashMap<>();
    data.forEach(
            i -> {
                count.putIfAbsent(i, 1);
                count.put(i, count.get(i) + 1);
            }
    );
    int maxCount = count.values().stream().max(Integer::compare).get(); // this assumes that the data is not empty
    if (count.values().stream().filter(i -> i == maxCount).count() > 1) {
        // more than one mode present
        return Double.NaN;
    }

    // here we'll be sure that only one mode exists
    return count
            .entrySet()
            .stream()
            .filter(e -> e.getValue() == maxCount)
            .findFirst() // as we've only one mode
            .get()
            .getKey();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...