2010-09-13 150 views
22

我正在尋找優雅方式Scala將給定的字符串拆分爲固定大小的子字符串(序列中的最後一個字符串可能更短)。如何將字符串拆分爲等長的子字符串?

所以

split("Thequickbrownfoxjumps", 4) 

應該產生

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

當然,我可以簡單地用一個循環,但必須有一個更優雅(功能型)解決方案。

回答

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

像這樣:

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") 


\***************************************************************************/ 
相關問題