Как нарезать строку на подстроки заданной длины - PullRequest
1 голос
/ 29 декабря 2008

У меня есть строка, которую я хочу разделить на массив подстрок заданной длины 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

Это лучшее, что я мог сделать. Это выглядит некрасиво для меня.

Есть ли более хорошая / короткая версия этого, может быть, без цикла?

Ответы [ 2 ]

9 голосов
/ 29 декабря 2008

stringInstance.[start..end] гораздо лучше читается, чем String.sub. Вот что я придумал:


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

Или вы можете использовать:


    let chop (input : string) len = 
        Array.init (input.Length / len) (fun index ->
            let start = index * len
            input.[start..start + len - 1])
0 голосов
/ 30 декабря 2008

Крейг Штунц оставил здесь ответ, который сейчас отсутствует. Так или иначе, он указал на статью о F # , в которой есть две функции для работы со строками: explode и implode. Эти две функции взяты из стандартной библиотеки 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 делает противоположное - объединяет список строк в одну строку.
Обе функции являются рекурсивными, поэтому было бы интересно сравнить производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...