Сплит / группа коллекционирования по последовательным элементам - PullRequest
0 голосов
/ 17 февраля 2020

Предположим, у меня есть список / массив, содержащий символы. Как мне сгруппировать / разделить / объединить их, чтобы получить что-то подобное?

val input = arrayOf('b', 'b', 'c', 'd', 'e', 'e', 'e')

val output = groupOrSplit(input) // ['bb', 'c', 'd', 'eee']

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

В стандартной библиотеке нет функций для разбиения строки, как вы хотите, поэтому вы должны написать эту функцию самостоятельно:

fun splitDistinct(arr: CharArray): List<String> = arr
    .fold(ArrayList<StringBuilder>()) { acc, ch -> acc.apply {
        if (isEmpty() || last().last() != ch)
            add(StringBuilder(ch.toString()))
        else
            last().append(ch)
    }}
    .map { it.toString() }


fun main() {
    val arr = charArrayOf('b', 'b', 'c', 'd', 'e', 'e', 'e')
    println(splitDistinct(arr))
}
0 голосов
/ 17 февраля 2020

Без подробностей, я бы сделал что-то вроде этого:

listOf("b", "b", "c", "d", "e", "e", "e").asSequence()

    // b => b to ["b", "b"]
    // c => c to ["c"], etc
    .groupBy { it }

    // b => "bb", etc
    .map { entry -> entry.value.joinToString("") }

    .toList()

// Result is listOf("bb", "c", "d", "eee")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...