Как сгладить список списка с определенной стратегией - PullRequest
2 голосов
/ 27 июня 2019

Я получил этот список списков:

[[1, 2, 3], [4, 5], [6]] = listOf(listOf(1,2,3), listOf(4,5), listOf(6))

Если я использую метод flatten, результат будет:

[1, 2, 3, 4, 5, 6] = listOf(1,2,3,4,5,6)

Вывод, который я хочу получить, будет выглядеть как круговое сглаживание, принимая первые N элементов каждого списка для сглаживания ...

Так что, если N = 1: [1, 4, 6, 2, 5, 3]

если N = 2: [1, 2, 4, 5, 6, 3]

если N = 3: [1, 2, 3, 4, 5, 6]

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

Ответы [ 3 ]

0 голосов
/ 27 июня 2019
val numbers = listOf(listOf(1, 2, 3), listOf(4, 5), listOf(6))
println(numbers.roundRobin(1)) // [1, 4, 6, 2, 5, 3]
println(numbers.roundRobin(2)) // [1, 2, 4, 5, 6, 3]
println(numbers.roundRobin(3)) // [1, 2, 3, 4, 5, 6]


fun <T> List<List<T>>.roundRobin(count: Int): List<T> {
    return flatMap { it.chunked(count)
                        .mapIndexed { i, v -> i to v } }
        .sortedBy { it.first }
        .flatMap { it.second }
}
0 голосов
/ 01 июля 2019

Вы можете попробовать это. Это рекурсивная функция.

var flattenedList : MutableList<Int> = ArrayList()

fun List<*>.flatten(){
    for(i in this){
        when(i){
            is Int -> {
                flattenedList.add(i)
            }
            is List<*> -> {
                i.flatten()
            }
        }
    }
}

fun main(){
    var list = listOf(listOf(1,2,3), listOf(4,5,6), 7)
    list.flatten()
    println(flattenedList.toString())
}
0 голосов
/ 27 июня 2019

Это должно сработать, хотя, на мой взгляд, синтаксис не так хорош.Вероятно, есть способ оптимизировать следующее решение, но я думаю, что это хорошее место для начала.

val numberOfElements = 1
val numbers = listOf(listOf(1, 2, 3), listOf(4, 5), listOf(6))
val result = numbers.flatMap {
        it.take(numberOfElements)
    }.union(numbers.flatMap { if (it.size - numberOfElements > 0) {
        it.takeLast(it.size - numberOfElements)
    } else {
        emptyList()
    } })

println(result) 
// numberOfElements = 1 --> [1, 4, 6, 2, 3, 5]
// numberOfElements = 2 --> [1, 2, 4, 5, 6, 3]
// numberOfElements = 3 --> [1, 2, 3, 4, 5, 6]

...