列表中的组字符串最大值

时间:2017-10-30 12:34:26

标签: scala

一直试图在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

非常感谢任何正确方向的指针!

1 个答案:

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