如何将字符串分割为相等长度的子字符串?

30

我正在寻找一种优雅的方法,使用Scala将给定字符串分成固定长度的子字符串(序列中的最后一个字符串可能会更短)。

因此,

split("Thequickbrownfoxjumps", 4)

应该产生

["Theq","uick","brow","nfox","jump","s"]

当然我可以使用循环,但必须有一种更优雅(函数式风格)的解决方案。

2个回答

78
scala> val grouped = "Thequickbrownfoxjumps".grouped(4).toList
grouped: List[String] = List(Theq, uick, brow, nfox, jump, s)

分组(grouped)……我总是记不住这个方法名 - 必须经常查看:特别是考虑到partitition - 这是基于谓词的拆分。 - WestCoastProjects

2

就像这样:

def splitString(xs: String, n: Int): List[String] = {
  if (xs.isEmpty) Nil
  else {
    val (ys, zs) = xs.splitAt(n)
    ys :: splitString(zs, n)
  }
}

splitString("Thequickbrownfoxjumps", 4)
/************************************Executing-Process**********************************\
(   ys     ,      zs          )
  Theq      uickbrownfoxjumps
  uick      brownfoxjumps
  brow      nfoxjumps
  nfox      jumps
  jump      s
  s         ""                  ("".isEmpty // true)


 "" :: Nil                    ==>    List("s")
 "jump" :: List("s")          ==>    List("jump", "s")
 "nfox" :: List("jump", "s")  ==>    List("nfox", "jump", "s")
 "brow" :: List("nfox", "jump", "s") ==> List("brow", "nfox", "jump", "s")
 "uick" :: List("brow", "nfox", "jump", "s") ==> List("uick", "brow", "nfox", "jump", "s")
 "Theq" :: List("uick", "brow", "nfox", "jump", "s") ==> List("Theq", "uick", "brow", "nfox", "jump", "s")


\***************************************************************************/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接