Scala字符串分裂为减少的char数量

时间:2015-03-26 13:21:24

标签: string scala scala-collections

给出一个字符串,如

val s = (0 to 9).mkString
s: String = 0123456789

努力寻找一种功能性(整洁)的方法来获得Array[String]这样的

Array("0123", "456", "78", "9")

在预先计算的索引上使用substring证明非常混乱。

更新数组大小n和字符串长度l始终相关

val l = n*(n+1)/2

换句话说,输入字符串为n = 1,2,...的长度为1,3,6,10,15,...因此如@mz所述,像0123456789a这样的字符串没有溶液

2 个答案:

答案 0 :(得分:2)

您可以尝试使用Iterator

Iterator.from(0).map { i => 
    s.dropRight(i*(i+1)/2).takeRight(i+1)
}.takeWhile(!_.isEmpty).toList.reverse

或递归:

def incSplit(s: String, iter: Int = 1): List[String] = s match {
    case "" => Nil
    case s => incSplit(s.dropRight(iter), iter + 1) :+ s.takeRight(iter)
}

答案 1 :(得分:1)

这是另一个解决方案

  val s = "0123456789" 
  (4 to 1 by -1).foldLeft((s,List[String]()))
                         {case ((t, res), n) => 
                            (t.drop(n), t.take(n)::res)}
                ._2
                .reverse

每次我们从字符串中取出前n个字符时,将其添加到结果中并将字符串(减去前n个字符)传递给下一个迭代

编辑:到目前为止所有的答案都很难看。所以这里更优雅(IMO)

val s = "0123456789"
    //> s  : String = 0123456789
val indicies = (4 to 1 by -1).scanLeft(0) {_ + _}
    //> indicies  : List[Int] = List(0, 4, 7, 9, 10)
val slices = indicies zip indicies.tail   
    //> slices  : List[(Int, Int)] = List((0,4), (4,7), (7,9), (9,10))
for ((start,end) <- slices) yield s.slice(start, end)
    //> res1: List[String] = List(0123, 456, 78, 9)