2008-12-29 56 views
1

我有字符串,我想切成給定長度n的子字符串數組。我對餘數不感興趣(如果字符串的長度不能被n除以餘數除)如何將字符串切成給定長度的子字符串

let ChopString (myString : string) n = 
    let res = 
     seq{ 
      for i = 0 to myString.Length/n - 1 do 
       yield(String.sub myString (i*n) n) 
      }  
     |> Seq.to_array 
    res 

這是我能做的最好的。我看起來很醜陋。

有沒有更好/更短的版本,也許沒有循環?

+0

你需要很好地打破單詞邊界?從你的示例代碼我猜「不」,但我想確定。 – 2008-12-29 19:04:36

+0

不,我只是想將字符串拆分爲給定長度的子字符串,從字符串的開始處開始 - 不關心內容,不關心任何比給定子字符串長度更短的餘數 – zendar 2008-12-30 01:58:13

回答

8

stringInstance.[start..end]String.sub更具可讀性。以下是我想出了:


let chop (input : string) len = 
    seq { for start in 0 .. len .. input.Length/len 
     do yield input.[start..start + len - 1] } 
    |> Seq.to_array 

或者你可以使用:


let chop (input : string) len = 
    Array.init (input.Length/len) (fun index -> 
     let start = index * len 
     input.[start..start + len - 1]) 
0

Craig Stunz左答案在這裏,現在下落不明。無論如何,他指出article about F#有兩個字符串處理功能:explodeimplode。這兩個函數來自標準ML庫。下面的代碼:

let rec explode str = 
     let len = String.length str in 
      if len=0 then [] else 
       (String.sub str 0 1) :: explode (String.sub str 1 (len-1)) 

let rec implode lst = match lst with 
         [] -> "" 
         | x1 :: x2 -> x1^implode x2 

explode排骨串入串列表,其中每個字符串是一個字符。
implode確實相反 - 將字符串列表連接成一個字符串。
這兩個函數都是遞歸的,所以比較性能會很有趣。

相關問題