Как проверить, что все значения в мапе равны нулю
Что проверяют
Простая задача на знание стандартной библиотеки Kotlin и внимание к краям: пустая мапа, тип значений, nullable. Следом обычно спрашивают, что вернёт ваше решение на пустой мапе и как быть, если проверка нужна часто.
Как отвечать
Базовое решение в одну строку, без ручного цикла:
fun allZero(map: Map<String, Int>): Boolean = map.values.all { it == 0 }Дальше покажите, что понимаете детали:
all: останавливается на первом ненулевом значении, так что всю мапу проходит только в худшем случае.map.valuesэто представление, копия коллекции не создаётся;- пустая мапа:
allна пустой коллекции возвращаетtrue. Если по бизнес-логике пустая мапа не считается «все нули», добавьте явноmap.isNotEmpty() && ...; - эквивалент:
map.values.none { it != 0 }делает то же самое, выбирайте то, что читается естественнее; - тип значений: для
Longсравнение с литералом0не скомпилируется, нужен0L. ДляDoubleсравнивайте с0.0, а если значения получены вычислениями, то с допуском. УBigDecimalоператор==вызываетequalsс учётом масштаба, поэтомуBigDecimal("0.00") == BigDecimal.ZEROдаётfalse, надёжнееsignum() == 0; - nullable: для
Map<String, Int?>условиеit == 0вернётfalseнаnull, и это стоит проговорить как осознанное поведение.
Если такую проверку дёргают постоянно, например на каждом обновлении состояния экрана, её можно сделать O(1): хранить рядом счётчик ненулевых значений и менять его при каждой записи в мапу. Это обмен простоты кода на скорость, подавайте его как вариант, а не как решение по умолчанию.
Где спотыкаются
Пишут цикл с флагом и без раннего выхода: код длиннее, а проходит всю мапу даже после первого ненулевого значения.
Не думают про пустую мапу и удивляются, что функция вернула true там, где ждали false.
Забывают про многопоточность: если мапу меняет другой поток, обычная HashMap при переборе может бросить ConcurrentModificationException. На Android состояние экрана лучше держать неизменяемым, например в StateFlow с новой копией мапы на каждое изменение.