簡體   English   中英

Function 根據特定元素值將字符串列表拆分為字符串組

[英]Function to split a list of strings into group of strings on specific element value

我正在嘗試為以下內容創建一個 function:

給定一個字符串列表["abceadfapaq"; "asdqwedasca"; " "; "asdasqyhgahfgasdsadasda"] ["abceadfapaq"; "asdqwedasca"; " "; "asdasqyhgahfgasdsadasda"] ["abceadfapaq"; "asdqwedasca"; " "; "asdasqyhgahfgasdsadasda"]字符串分隔符" "返回另一個列表,其中子列表按所需分隔符拆分。 [["abceadfapaq"; "asdqwedasca"]; ["asdasqyhgahfgasdsadasda"]]

我已經實現了兩個函數來實現這一點,其中一個失敗了,因為它無法將分隔符處理為空白" "

失敗:

let groupWithNoReplace (inputLines: string list) (separator: string) =
        let complete = 
            seq {
                for line in inputLines do
                    yield! line.Split(' ')
            } |> List.ofSeq
        let folder (a) (cur, acc) = 
            match a with
            | _ when a <> separator -> a::cur, acc
            | _ -> [], cur::acc 
        let result = List.foldBack folder (complete) ([], [])
        (fst result)::(snd result)

let groupWithNoReplace0 = 
    groupWithNoReplace ["abceadfapaq"; "asdqwedasca"; " "; "asdasqyhgahfgasdsadasda"] " "

val groupWithNoReplace0: string list list =
  [["abceadfapaq"; "asdqwedasca"; ""; ""; "asdasqyhgahfgasdsadasda"]]

let groupWithNoReplace00 = 
    groupWithNoReplace ["abceadfapaq"; "asdqwedasca"; "="; "asdasqyhgahfgasdsadasda"] "="

val groupWithNoReplace00: string list list =
  [["abceadfapaq"; "asdqwedasca"]; ["asdasqyhgahfgasdsadasda"]]

所以第二個 function 是相同的,但是用一個符號替換了空白區域我認為它不會出現在輸入"§"中我不喜歡這個解決方案,因為我不想強制輸入滿足特定的要求根據我的實施。

使用替換

let groupWithNoReplace (inputLines: string list) (separator: string) =
        let validlines = inputLines |> List.map(fun e -> if e = " " then "§" else e)
        let validsplitter =
            match separator = " " with
            | true -> "§"
            | false -> separator
        let complete = 
            seq {
                for line in validlines do
                    yield! line.Split(' ')
            } |> List.ofSeq
        let folder (a) (cur, acc) = 
            match a with
            | _ when a <> validsplitter -> a::cur, acc
            | _ -> [], cur::acc
                
        let result = List.foldBack folder (complete) ([], [])
        (fst result)::(snd result)

let groupWithNoReplace1 = 
    groupWithNoReplace 
["abceadfapaq"; "asdqwedasca"; " "; "asdasqyhgahfgasdsadasda"] " "

val groupWithNoReplace1: string list list =
  [["abceadfapaq"; "asdqwedasca"]; ["asdasqyhgahfgasdsadasda"]]

let groupWithNoReplace11 = 
    groupWithNoReplace ["abceadfapaq"; "asdqwedasca"; "="; "asdasqyhgahfgasdsadasda"] "="

val groupWithNoReplace11: string list list =
  [["abceadfapaq"; "asdqwedasca"]; ["asdasqyhgahfgasdsadasda"]]

這應該有效:

let splitWhen predicate list =
    let folder state t =
        if predicate t then
            [] :: state
        else
            (t :: state.Head) :: state. Tail

    list 
    |> List.fold folder [ [] ] 
    |> List.map List.rev
    |> List.rev

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM