一直试图在scala中解决这个问题,但是不能完全理解它。
我有一个List[String]
,并希望将不同的字符串组合在一起,以便没有任何组超过最大大小,并在列表中记下它们的索引。
以下是一些示例数据:
val sample: List[String] = List[String](
"{\"test\":\"testfield\"}", // 20 length
"{\"test2\":\"testfield2\"}", // 22 length
"{\"test3\":\"testfield3\"}") // 22 length
val maxLength = 48 // collect into groups where total .length is less than this
val output: List[List[Int]] =
List(
List(0,1),
List(2)
)
我已经设法在Java中模拟相同的东西,但尝试在没有for循环的情况下在Scala样式代码中复制它是胜过我。我目前一直在尝试使用scanLeft
。
非常感谢任何正确方向的指针!
答案 0 :(得分:1)
这是使用foldLeft
的版本:
def groupByLength(list: List[String]): List[List[String]] = {
list.foldLeft(List(List.empty[String])) { (acc, cur) =>
if (acc.isEmpty) List(List(cur))
else if (acc.last.map(_.length).sum + cur.length < maxLength) acc.init :+ (acc.last :+ cur)
else acc :+ List(cur)
}
}
对于您的样本,它返回:
List(
List({"test":"testfield"}, {"test2":"testfield2"}),
List({"test3":"testfield3"})
)
对于更好的版本,可以使用NonEmptyList
来保证生成的List有人居住。
如果您想要返回列表的索引,可以事先zipWithIndex
。