2008-12-29 29 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确实相反 - 将字符串列表连接成一个字符串。
这两个函数都是递归的,所以比较性能会很有趣。

相关问题