如何实现支持空格分隔符的F#字符串列表分组函数?
问题:按指定分隔符分组字符串列表
需求说明
给定字符串列表(示例:["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"]]
问题核心:当输入行是空格字符串" "时,用Split(' ')会拆分成两个空字符串"",导致最终结果混入无效空元素。
替换实现的有效函数
通过将空格替换为特殊符号"§"实现功能,但要求输入不能包含该符号,存在明显局限性:
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"]]
寻求最优方案
需要一种无需依赖输入内容限制的实现,避免使用可能与输入冲突的特殊符号,同时准确完成按指定分隔符分组的需求。
内容的提问来源于stack exchange,提问作者blfuentes
相关产品推荐
相关产品推荐

