Scala中是否有一些预定义函数可以通过某种逻辑将列表拆分为多个列表?我找到了grouped
方法,但它不符合我的需要。
例如,我有字符串列表:List("questions", "tags", "users", "badges", "unanswered")
。
我希望按字符串的最大长度(例如12)拆分此列表。换句话说,在每个结果块中,所有字符串长度的总和不应超过12:
List("questions"), List("tags", "users"), List("badges"), List("unanswered")
编辑:我不一定需要找到将字符串组合成块的最佳方式,只需检查列表中下一个字符串的线性循环,如果其长度不符合要求(12)则返回当前块并且下一个字符串将属于下一个块
答案 0 :(得分:4)
我知道没有buildIn机制可以做到这一点,但你可以用foldLeft
和编码来实现类似的东西:
val test = List("questions", "tags", "users", "badges", "unanswered")
test.foldLeft(List.empty[List[String]]) {
case ((head :: tail), word) if head.map(_.length).sum + word.length < 12 =>
(word :: head) :: tail
case (result, word) =>
List(word) :: result
}
-> res0: List[List[String]] = List(List(unanswered), List(badges), List(users, tags), List(questions))
答案 1 :(得分:0)
如果您可以对字符串的最大长度(例如10个字符)做出合理的假设,那么您可以使用sliding
,这对于长列表来说要快得多:
val elementsPerChunk = ??? // do some maths like
// CHUNK_SIZE / MAX_ELEM_LENGTH
val test = List("questions", "tags", "users", "badges", "unanswered")
test.sliding(elementsPerChunk, elementsPerChunk).toList