我有一个以下列表,需要根据索引进行分组。分组是用第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)
不确定如何一次性获得所有项目的预期结果。
答案 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> 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))