【问题标题】:How to flatten a list of list with a specific strategy如何使用特定策略展平列表列表
【发布时间】:2019-11-09 11:18:09
【问题描述】:

我得到了这个列表列表:

[[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]

我想这可以通过使用一些可变列表来实现,但它会非常难看而且根本没有功能。

【问题讨论】:

  • 我认为 zip() 操作是你需要的,但你需要手动将它与 flatten 结合起来
  • zip 还不够。如果所有列表的大小相同,它适用于 N=1 。但在我们的例子中,它会返回[1, 4, 6]...

标签: kotlin flatten


【解决方案1】:

在我看来,即使语法不是很好,这也应该可以解决问题。可能有一种方法可以优化以下解决方案,但我认为这是一个很好的起点。

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]

【讨论】:

    【解决方案2】:
    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 }
    }
    

    【讨论】:

      【解决方案3】:

      你可以试试这个。 这是一个递归函数。

      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())
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-24
        • 1970-01-01
        • 1970-01-01
        • 2012-03-19
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 2014-04-22
        相关资源
        最近更新 更多