Разбиение коллекции в Kotlin на подсписки
Имеется очередь (ArrayDeque) двоичных значений. Для определенности такая: 0x11, 0x22, 0, 0x33, 0x44, 0, 0x55, 0x66, 0x77, 0x88, 0, 0xaa, 0xbb
Можно ли с помощью операций с последовательностями разбить ее на подсписки? Значение 0 является разделителем. Т.е. надо изобразить что-то типа split() для строк. В идеале получить список коллекций, где эти подпоследовательности идут в том же порядке, что и в исходной очереди. Желаемый результат:
{0x11, 0x22}
{0x33, 0x44}
{0x55, 0x66, 0x77, 0x88}
{0xaa, 0xbb}
Спасибо.
Ответы (1 шт):
Автор решения: Alex_Skvortsov
→ Ссылка
Я не нашел нужный стандартный метод, так что написал сам:
inline fun <reified T> List<T>.splitBy(separator: T): List<List<T>> {
if (isEmpty()) return emptyList()
val result = mutableListOf<MutableList<T>>()
forEach {
if (it == separator) {
result.add(mutableListOf())
} else {
if (result.isEmpty()) result.add(mutableListOf())
result.last().add(it)
}
}
// Если для завершающего 0 или нескольких 0 подряд хотите видеть пустые подсписки, то замените на return result
return result.filterNot { it.isEmpty() }
}
Пример вызова:
listOf(0, 1, 2, 0, 3, 4, 0, 6, 5, 0, 7, 0, 0, 10, 9, 0).splitBy(0)