使用zipWithIndex对列表项进行分组

时间:2018-06-06 07:05:54

标签: scala

我有一个以下列表,需要根据索引进行分组。分组是用第i个项目完成的(第i + 6)项(列表大小是6的倍数)。

val list = List("a" ,"b" ,"c" ,"d" ,"e" ,"f" ,"g" ,"h" ,"i" ,"j" ,"k","l")

预期结果:

    "a" , "g"
    "b" , "h"
    "c" , "i"
    "d" , "j"
    "e" , "k"
    "f" , "l"

我可以使用

对单个项目进行分组
list.view.zipWithIndex.filter { _._2 % 6 == 0 }.map { _._1}.force

给出结果

Seq[String] = List(a, g)

不确定如何一次性获得所有项目的预期结果。

3 个答案:

答案 0 :(得分:5)

list.grouped(6).toList.transpose

分组(6)每次会将列表中断6个元素,并且转置从

转换列表

List[List[String]] = List(List(a, b, c, d, e, f), List(g, h, i, j, k, l))

List[List[String]] = List(List(a, g), List(b, h), List(c, i), List(d, j), List(e, k), List(f, l))

答案 1 :(得分:3)

如果您确保输入列表的长度是所需分组因子的倍数,那么@RyanTheLeach的答案肯定是要走的路。

如果您没有这种保证,那么您可能需要自己动手。

val list :List[String] = List("a","b","c","d","e","f","g","h")  //short List
val mapLst = list.zipWithIndex
                 .foldRight(Map[Int,List[String]]().withDefaultValue(Nil)){
  case ((s,i),m) => m + (i%6 -> (s :: m(i%6)))
}
val grouped = mapLst.keys.toList.sorted.map(mapLst)
//grouped: List[List[String]] = List(List(a, g), List(b, h), List(c), List(d), List(e), List(f))

答案 2 :(得分:1)

val list = List("a" ,"b" ,"c" ,"d" ,"e" ,"f" ,"g" ,"h" ,"i" ,"j" ,"k","l") 
def groupList(list:List[String],m:Int) = for(j<-(0 to m-1).toList) yield{ 
               for(i<-(j to list.size-1 by m).toList) yield list(i)
              }

在SCALA REPL中:

scala> groupList(list,6)
res91: List[List[String]] = List(List(a, g), List(b, h), List(c, i), List(d, j), List(e, k), List(f, l))

scala> groupList(list,3)
res92: List[List[String]] = List(List(a, d, g, j), List(b, e, h, k), List(c, f, i, l))