代码之家  ›  专栏  ›  技术社区  ›  maloney

按Scala中的给定事件分组列表

  •  1
  • maloney  · 技术社区  · 9 年前

    我有一个字符串列表,我试图将其按顺序拆分为单独的列表,将第4个出现的字符串分组,即此列表:

    val data = List("1", "2", "3", "4", "5", "6", "7", "8") 
    

    应分组为

    val list1 = List("1", "5")
    val list2 = List("2", "6")
    val list3 = List("3", "7")
    val list4 = List("4", "8")
    

    我不确定我是否试图将其过于复杂,但我认为唯一的方法是首先使用 sliding 例如。:

    data.sliding(4,4).toList 
    

    中的个结果

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

    然后实现我自己的 unzip 方法,将上面的内容分组为我想要的输出。

    有人能告诉我有没有更简单的方法吗?

    4 回复  |  直到 9 年前
        1
  •  3
  •   Marth    9 年前

    你可以使用 .transpose 在列表中 .sliding 生成:

    scala> val data = List("1", "2", "3", "4", "5", "6", "7", "8") 
    data: List[String] = List(1, 2, 3, 4, 5, 6, 7, 8)
    
    scala> data.sliding(4, 4).toList
    res1: List[List[String]] = List(List(1, 2, 3, 4), List(5, 6, 7, 8))
    
    scala> data.sliding(4, 4).toList.transpose
    res2: List[List[String]] = List(List(1, 5), List(2, 6), List(3, 7), List(4, 8))
    
        2
  •  2
  •   Alexey Romanov    9 年前

    适用于每个列表长度的版本:

    def groupNth[A](n: Int, list: List[A]): List[List[A]] = {
      val (firstN, rest) = list.splitAt(n)
      val groupedRest = if (rest.nonEmpty) groupNth(n, rest) else Nil
      // null.asInstanceOf[A] is of course cheating, but the value is never used
      firstN.zipAll(groupedRest, null.asInstanceOf[A], Nil).map {
        case (h, t) => h :: t
      }
    }
    
    
    println(groupNth(4, Nil))
    // List()
    println(groupNth(4, List(1, 2, 3)))
    // List(List(1), List(2), List(3))
    println(groupNth(4, List(1, 2, 3, 4, 5, 6, 7, 8)))
    // List(List(1, 5), List(2, 6), List(3, 7), List(4, 8))
    println(groupNth(4, List(1, 2, 3, 4, 5, 6, 7, 8, 9)))
    // List(List(1, 5, 9), List(2, 6), List(3, 7), List(4, 8))
    println(groupNth(4, List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12)))
    // List(List(1, 5, 9), List(2, 6, 10), List(3, 7, 11), List(4, 8, 12))
    
        3
  •  0
  •   Nagarjuna Pamu    9 年前

    zip 之后 sliding

    scala> val data = List("1", "2", "3", "4", "5", "6", "7", "8")
    data: List[String] = List("1", "2", "3", "4", "5", "6", "7", "8")
    
    scala> val result = data.sliding(4, 4).toList
    result: List[List[String]] = List(List("1", "2", "3", "4"), List("5", "6", "7", "8"))
    
    scala> result.transpose
    res7: List[(String, String)] = List(("1", "5"), ("2", "6"), ("3", "7"), ("4", "8"))
    
        4
  •  0
  •   The Archetypal Paul    9 年前

    如果元组可以作为输出,那么它相当简洁:

     val tuples = data zip data.drop(4)
     //> tuples  : List[(String, String)] = List((1,5), (2,6), (3,7), (4,8))
    

    把他们变成 List :

    tuples.map{case(a,b) => List(a, b)} 
    //> List[List[String]] = List(List(1, 5), List(2, 6), List(3, 7), List(4, 8))
    

    编辑:显示关于只使用8的注释不正确

     def pairs[A](xs:List[A], n:Int) =
     (xs zip xs.drop(n)).map{case(a,b) => List(a, b)}
    
    pairs(List("1","2", "3", "4", "5", "6", "7", "8"), 4)
    // List(List(1, 5), List(2, 6), List(3, 7), List(4, 8))
    pairs(List("1","2", "3", "4", "5", "6", "7", "8", "9"), 4)
    // List(List(1, 5), List(2, 6), List(3, 7), List(4, 8), List(5, 9))
    
    pairs(List("1","2", "3", "4", "5", "6", "7", "8", "9", "10"), 4)
    // List(List(1, 5), List(2, 6), List(3, 7), List(4, 8), List(5, 9), List(6, 10))
    pairs(List("1","2", "3", "4"), 4)
    // List()
    pairs(List("1","2", "3"), 4)
    // List()
    
    推荐文章