> Как проверить, что все значения в мапе равны нулю (Android)
Уровень: middle · Роль: mobile · Категория: Технические вопросы
Компании: Ozon
Стек: Android
> Пример ответа
Короткий ответ
Проверить, что все значения в мапе равны нулю, можно через all на коллекции значений: map.values.all { it == 0 }. Для Map<String, Int> это вернёт true, если каждое значение равно нулю, и false в противном случае. Для пустой мапы результат также будет true, что соответствует математической логике. Если нужна проверка на null-значения, используйте all { it == null || it == 0 } или явную проверку типа.
Подробное объяснение
В Kotlin Map - это коллекция пар "ключ-значение". Метод values возвращает Collection<V> со всеми значениями. Функция all - стандартный предикат из стандартной библиотеки, который возвращает true, только если каждый элемент коллекции удовлетворяет условию. Для проверки равенства нулю используется лямбда { it == 0 }.
Важно учитывать тип значений: для Int, Long, Double сравнение с нулём работает напрямую. Для nullable-типов (Int?) нужно дополнительно обрабатывать null, иначе it == 0 вернёт false для null. Также стоит помнить, что all на пустой коллекции всегда возвращает true - это стандартное поведение, которое часто вызывает вопросы на собеседовании.
Альтернативные подходы: использование none { it != 0 } (эквивалентно), или цикл с ранним выходом для экономии памяти при больших мапах. Но all - самый идиоматичный и читаемый вариант.
На практике
В Android-разработке такая проверка часто нужна при работе с состояниями UI, например, когда все поля формы заполнены нулями, или при анализе данных с датчиков. Важно помнить о производительности: all выполняет короткое замыкание - прекращает итерацию при первом несоответствии, поэтому для больших мап это эффективно.
Если мапа может содержать null-значения, лучше использовать явную проверку: map.values.all { it == null || it == 0 }. Для Map<String, Int?> это корректно обработает все случаи. Также можно использовать map.values.filterNotNull().all { it == 0 }, но это создаст промежуточную коллекцию - менее эффективно.
Пример кода
fun allValuesZero(map: Map<String, Int>): Boolean { return map.values.all { it == 0 } } // Для nullable-значений fun allValuesZeroOrNull(map: Map<String, Int?>): Boolean { return map.values.all { it == null || it == 0 } } // Пример использования fun main() { val map1 = mapOf("a" to 0, "b" to 0) val map2 = mapOf("a" to 0, "b" to 1) val emptyMap = emptyMap<String, Int>() println(allValuesZero(map1)) // true println(allValuesZero(map2)) // false println(allValuesZero(emptyMap)) // true }
Как отвечать на собеседовании
Начните с простого решения через all, затем поясните поведение для пустой мапы и nullable-типов. Упомяните короткое замыкание как преимущество. Если спросят про альтернативы, предложите none { it != 0 } или цикл с return false при первом ненулевом значении. Покажите понимание trade-off между читаемостью и производительностью - для большинства случаев all достаточно.
Хорошо добавить пример из практики: проверка состояния формы или данных с датчиков. Если интервьюер уточнит про большие мапы, скажите, что all уже оптимален из-за раннего выхода, но для очень больших данных можно рассмотреть параллельную обработку через parallelStream или coroutines, хотя это редко нужно.
Что проверяет интервьюер
Интервьюер оценивает знание стандартной библиотеки Kotlin, понимание работы коллекций и предикатов. Важно показать, что вы знаете про all, any, none и их поведение на пустых коллекциях. Также проверяется внимательность к типам - nullable-значения и корректная обработка. Умение объяснить короткое замыкание показывает понимание внутреннего устройства.
Дополнительно может проверяться способность предложить альтернативные решения и обосновать выбор. Хороший ответ включает упоминание edge cases (пустая мапа, null) и практическое применение.
Типичные ошибки
- Забыть про
null-значения:all { it == 0 }вернётfalseдляnull, что может быть неожиданно. - Не учитывать, что
allна пустой мапе возвращаетtrue- кандидат может ошибочно утверждать, что нужно вернутьfalse. - Использовать
map.values.filter { it == 0 }.size == map.size- неэффективно, создаёт лишние коллекции. - Путать
allсany:any { it == 0 }вернётtrue, если хотя бы одно значение ноль, что не то же самое. - Предлагать ручной цикл без объяснения, почему это лучше - обычно это хуже по читаемости.
> Похожие задачи по mobile
Знаете ли вы полную аббревиатуру state machine
Что такое битовые сдвиги и где они применяются
Какая структура данных подходит для хранения количества букв в строках при проверке анаграмм
Как используется рефлексия при сериализации
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью