Scala:通过一些逻辑将数组拆分成块

时间:2015-09-29 18:58:00

标签: scala

Scala中是否有一些预定义函数可以通过某种逻辑将列表拆分为多个列表?我找到了grouped方法,但它不符合我的需要。

例如,我有字符串列表:List("questions", "tags", "users", "badges", "unanswered")

我希望按字符串的最大长度(例如12)拆分此列表。换句话说,在每个结果块中,所有字符串长度的总和不应超过12:

List("questions"), List("tags", "users"), List("badges"), List("unanswered")
编辑:我不一定需要找到将字符串组合成块的最佳方式,只需检查列表中下一个字符串的线性循环,如果其长度不符合要求(12)则返回当前块并且下一个字符串将属于下一个块

2 个答案:

答案 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