Разбиение коллекции в 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)

→ Ссылка