[英]How to split a list-of-strings into sublists-of-strings by a specific string element
[英]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.