Я предполагаю, что вы используете 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();
}