如何在Scala中使用循环法展平嵌套列表?

如何在Scala中使用循环法展平嵌套列表?,scala,Scala,您将如何在Scala中展平此列表:List(List(1,2,3),Nil,List(4,5,6),List(7,8))以使其进行循环,而不仅仅像flatMap那样附加所有元素?期望的结果是:List(1,4,7,2,5,8,3,6) 与我的列表不同的是,它是单一类型的list[list[Int]],但看起来我也可以使用递归函数调用 将列表展平,同时将每个元素与其嵌套列表中的索引进行匹配 按嵌套列表中的索引排序 将元组映射为整数 list.flatMap(xs => xs.zipWithI

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

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

  • 将列表展平,同时将每个元素与其嵌套列表中的索引进行匹配
  • 按嵌套列表中的索引排序
  • 将元组映射为整数

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

  • 如果这是一项家庭作业,你需要将其标记为家庭作业

    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
    }
    

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

    另一种递归方法

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


    如果它是一个矩阵,也就是说所有嵌套列表都有相同的长度,那么可能的重复就非常容易了
    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抛出了一个异常。这就是为什么我们不能在这里使用转置。
    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()