У меня есть список целых чисел, которые необходимо сжать в список диапазонов int без потери какой-либо информации (должен быть способ отменить эту операцию).
В настоящее время у меня есть:
val ints = listOf(8, 9, 45, 48, 49, 60, 61, 61, 62, 63, 3, 4, 5, 4, 5, 6)
val out = ints
.map { it..it }
.fold(mutableListOf(ints[0]..(ints[0] - 1)),
{ acc, next ->
val prev = acc.last()
if (prev.last + 1 == next.first) {
acc[acc.lastIndex] = prev.first..next.last
} else {
acc.add(next)
}
acc
}).toList()
Что правильно выдает:
[8..9, 45..45, 48..49, 60..61, 61..63, 3..5, 4..6]
В моем решении есть два аспекта, которые мне не нравятся,
не работает для пустого списка из-за начального значения сгиба
это довольно многословно для котлина. У меня такое ощущение, что это можно решить немного более приятным способом.
Итак, вопрос в том, как исправить 1 и / или 2?
Заранее спасибо!