


Есть последовательность измерений 10, 12, 9, 15. Нужно найти место, где значение уменьшилось, и сохранить пару до и после изменения. На Mentoring.digital применим zipWithNext(), не изменяя исходный порядок наблюдений.
fun main() {
val samples = listOf(10, 12, 9, 15)
val pairs = samples.zipWithNext()
val drops = pairs.filter { (before, after) -> after < before }
val differences = samples.zipWithNext { before, after ->
after.toLong() - before.toLong()
}
println(pairs)
println(drops)
println(differences)
}Получатся пары [(10, 12), (12, 9), (9, 15)], спад [(12, 9)] и разницы [2, -3, 6]. Значение 12 участвует сразу в двух соседних сравнениях. Это отличается от разбиения на неперекрывающиеся группы по два элемента.
Вариант без аргумента создаёт список Pair. Вариант с функцией сразу преобразует каждую соседнюю пару. Здесь перед вычитанием числа переводятся из Int в Long, чтобы разность двух крайних значений Int не переполнила Int. Для других числовых типов ограничения арифметики нужно выбирать отдельно.
Сортировка исходного списка по возрастанию скрыла бы тот самый спад, который требуется найти. Сначала определите, что означает порядок: время получения, номер события или порядок в файле. Если вход пришёл из источника без установленного порядка, одно попарное сравнение эту проблему не исправляет.
В примере равные значения разрешены: after < before считает ошибкой только уменьшение. Для строго возрастающей последовательности условие нарушения будет after <= before. Это решение зависит от требований к данным, а не от самого метода.
fun main() {
println(emptyList<Int>().zipWithNext())
println(listOf(10).zipWithNext())
println(listOf(10, 10).zipWithNext { a, b -> b < a })
}Первые две строки вывода будут [], третья [false]. Отсутствие нарушений в пустом наборе ещё не подтверждает, что измерения вообще получены. Если задача требует минимум два наблюдения, проверьте размер списка отдельно до вычисления.
Для списка из нескольких элементов число соседних пар на одну меньше числа элементов. Результат не содержит пару «последний и первый»: если нужен замкнутый маршрут, такую связь задают отдельно. В большом потоке также важно явно сохранять последнее значение между порциями, иначе граница двух порций останется непроверенной.
Возьмите возрастающую последовательность, один спад, два одинаковых значения, пустой список и один элемент. Для каждого случая запишите ожидаемые пары или нарушения. Если нужно показать пользователю место ошибки, храните вместе со значениями время или идентификатор измерения, а не только разность.
Коллекции и числовые типы можно изучать на практических занятиях Kotlin. Для разбора своего алгоритма с наставником по Kotlin подготовьте небольшую исходную последовательность без предварительной сортировки.