Как уже сказал Kartik, вы правы, в вашем коде есть ошибки.В конце концов, в цикле есть еще один: вам нужно выйти из него, как только вы найдете ключ, соответствующий значению, или mode
может быть снова изменен в более поздней итерации, что приведет к неверному результату.Например,
new HashMap<>(Map.of(1, 3, 2, 1))
В этом случае ваш код правильно определит, что наибольшее количество равно 3. Цикл для поиска соответствующего ключа сначала изменится с 3 на 1, а в следующий раз - с 1 на 2. Таким образом, результат2, что неверно.Основная проблема заключается в том, что вы используете одну и ту же переменную, mode
, для двух целей: сначала счет режима, затем код режима.Не делай этого.Риск путаницы слишком велик.
Я хотел бы попытаться найти решение:
public static OptionalInt getModeIfUnique(Map<Integer, Integer> count) {
Optional<Integer> maxCount = count.values().stream().max(Comparator.naturalOrder());
OptionalInt modeKey = maxCount.flatMap(mc -> {
// Map containing only the entries having max count
Map<Integer, Integer> allModes = new HashMap<>(count);
allModes.values().removeIf(c -> c < mc);
if (allModes.size() == 1) {
return Optional.of(allModes.keySet().iterator().next());
} else {
return Optional.empty();
}
})
.map(OptionalInt::of)
.orElse(OptionalInt.empty());
return modeKey;
}
Испытание:
// Kartik’s example - should give no mode
System.out.println(getModeIfUnique(Map.of(1, 2, 2, 2, 4, 1)));
// My example - should give 1
System.out.println(getModeIfUnique(Map.of(1, 3, 2, 1)));
// Empty map - should give no mode
System.out.println(getModeIfUnique(Map.of()));
Вывод:
OptionalInt.empty
OptionalInt[1]
OptionalInt.empty