Есть ли способ сжать часть значений в списке, используя zipWithNext kotlin? - PullRequest
0 голосов
/ 27 января 2019

В официальной документации языка Kotlin есть функция zipWithNext, которая представлена ​​следующим образом.

val letters = listOf("a", "b", "c", "d", "e", "f")
val pairs = letters.zipWithNext {a, b -> a + b} // [ab, bc, cd, de, ef]

Есть ли способ суммировать только часть элементов этого списка и оставить остальные без изменений? Для сравнения вы можете использовать другой listOf("bc", "de"). В этом случае конечный результат должен выглядеть так: [a, bc, de, f]

1 Ответ

0 голосов
/ 27 января 2019

Я предполагаю, что размер начального списка является четным числом, иначе вы не сможете получить ожидаемый результат.

Для

val letters = listOf("a", "b", "c", "d", "e", "f")

с zipWithNext():

val pairs = (listOf("") + letters + listOf(""))
        .zipWithNext()
        .filterIndexed { index, _ -> index % 2 == 0 }
        .map { it.first + it.second }

с chunked(2):

val pairs = listOf(letters.first()) + 
            letters.subList(1, letters.size - 1).chunked(2).map { it[0] + it[1] } + 
            listOf(letters.last())

оба дают этот результат:

[a, bc, de, f]

Редактировать
Что касается списка сравнения:

fun getNewList(list: List<String>, comparison: List<String>) : List<String> {
    val newList = mutableListOf<String>()
    var flag = false
    list.forEachIndexed { i, s ->
        if (i < list.size - 1) {
            if (!flag) {
                val item = s + list[i + 1]
                if (comparison.contains(item)) {
                    newList.add(item)
                    flag = true
                } else {
                    newList.add(s)
                }
            } else {
                flag = false
            }
        } else {
            newList.add(s)
        }
    }
    return newList
}

этот код:

val letters = listOf("a", "b", "c", "d", "e", "f")
val comparison = listOf("bc", "de")
val newList = getNewList(letters, comparison)
println(newList)

напечатает:

[a, bc, de, f]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...