【问题标题】:How do you flatten a nested List using round robin in Scala?如何在 Scala 中使用循环法展平嵌套列表?
【发布时间】:2015-09-03 12:41:23
【问题描述】:

您将如何在 Scala 中展平此列表:List(List(1, 2, 3), Nil, List(4, 5, 6), List(7, 8)),以便它执行循环,而不仅仅是像 flatMap 那样附加所有元素?期望的结果是:List(1, 4, 7, 2, 5, 8, 3, 6)

this question 不同,我的列表是单一类型List[List[Int]],但看起来我也可以使用递归函数调用。

【问题讨论】:

  • 如果它是一个矩阵,这将非常容易,也就是所有嵌套列表的长度都相同...l.transpose.flatten
  • @dcastro:transpose 做了什么,取最小宽度和高度?
  • @Bergi 它旋转一个矩阵。所以,List(List(1,2,3), List(4,5,6)) 变成了List(List(1,4), List(2,5), List(3, 6))
  • @Bergi 抛出异常。这就是为什么我们不能在这里使用转置。

标签: scala


【解决方案1】:
  1. 扁平化列表,同时将每个元素与其在嵌套列表中的索引匹配
  2. 按它们在嵌套列表中的索引排序
  3. 将元组映射成整数

    list.flatMap(xs => xs.zipWithIndex).sortBy(_._2).map(_._1)
    
    //output 
    List(1, 4, 7, 2, 5, 8, 3, 6)
    

【讨论】:

    【解决方案2】:

    如果这是家庭作业,您需要将其标记为此类。

    def roundRobin(input: List[List[Int]]): List[Int] = {
      val m = input.filter(_.size > 0)
      if ( m.size > 0 ) 
        m map (mh => mh.head) ::: roundRobin(m map (mt => mt.tail)))
      else
        Nil
    }
    

    首先,收集非空列表。如果没有,我们就完成了。否则,收集每个剩余列表的头部,并连接到循环处理的尾部。

    【讨论】:

      【解决方案3】:

      另一种递归方法,

      def g(xs:List[List[Int]]): List[Int] = {
        if (xs.flatten.isEmpty) 
          Nil 
        else 
          xs.flatMap(_.take(1)) ++ g(xs.map(_.drop(1)))
      }
      

      因此

      g(List(List(1, 2, 3), List(), List(4, 5, 6), List(7, 8)))
      List(1, 4, 7, 2, 5, 8, 3, 6)
      

      g(List(Nil))
      List()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        • 2021-02-06
        • 1970-01-01
        • 1970-01-01
        • 2018-01-06
        相关资源
        最近更新 更多