gpt4 book ai didi

f# - 删除字符串列表中除首次出现之外的所有字符

转载 作者:行者123 更新时间:2023-12-04 13:25:40 25 4
gpt4 key购买 nike

我有一个名称列表,我需要输出一个字符串,该字符串按名称中的字母出现的顺序显示,没有重复(例如,如果列表是 ["John"; "James"; "Jack"] ,则输出字符串应该是 Johnamesck )。我有一个解决方案(将所有名称折叠成一个字符串然后解析),但我觉得我通过让我的字符串可变来让它有点小气。

我还想声明这不是学校作业,只是一个同事的练习,因为我刚开始接触 F# 时只知道 Java Web 的东西。

这是我的工作解决方案(出于洞察目的):

let lower = ['a' .. 'z']
let upper = ['A' .. 'Z']
let mutable concatedNames = ["John"; "James"; "Jack"] |> List.fold (+) ""

let greaterThanOne (length : int) = length > 1
let stripChars (str : string) letter =
let parts = str.Split([| letter |])
match greaterThanOne (Array.length parts) with
| true -> seq {
yield Array.head parts
yield string letter
yield! Array.tail parts
}
|> String.concat ""
| _ -> str

let killAllButFirstLower = lower |> List.iter (fun letter -> concatedNames <- (stripChars concatedNames letter))
let killAllButFirstUpper = upper |> List.iter ( fun letter -> concatedNames <- (stripChars concatedNames letter))
printfn "All names with duplicate letters removed: %s" concatedNames

我最初想单独使用函数明确地做到这一点,并且在上述之前有一个解决方案
let lower = ['a' .. 'z']
let upper = ['A' .. 'Z']
:
:
:
let lowerStripped = [""]
let killLowerDuplicates = lower |> List.iter (fun letter ->
match lowerStripped.Length with
| 1 ->
(stripChars concatedNames letter)::lowerStripped |> ignore

| _ -> (stripChars (List.head lowerStripped) letter)::lowerStripped |> ignore

)

let upperStripped = [List.head lowerStripped]
let killUpperDuplicates = lower |> List.iter ( fun letter -> (stripChars (List.head upperStripped) letter)::upperStripped |> ignore )
let strippedAll = List.head upperStripped
printfn "%s" strippedAll

但是我无法让它工作,因为我意识到 consed 列表不会去任何地方(更不用说这可能效率低下)。这个想法是,通过这样做,一旦我解析了所有内容,列表的第一个元素将是所需的字符串。

我知道问一个我已经有解决方案的问题可能很奇怪,但我想使用 mutable只是我没有放弃我的命令式习惯(正如我所读的那样,很少需要使用它)并且我想更多地加强纯功能性。那么有没有更好的方法来做到这一点?如果我能以某种方式将结果通过管道传送到某处,那么第二种解决方案是否是一条可行的路线?

最佳答案

您可以使用 Seq.distinct 删除重复项并保留排序,因此您只需要将字符串列表转换为单个字符串,这可以通过 String.concat "" 完成。 :

let distinctChars s = s |> String.concat ""
|> Seq.distinct
|> Array.ofSeq
|> System.String

如果您运行 distinctChars ["John"; "James"; "Jack"] ,你会得到:
"Johnamesck"

关于f# - 删除字符串列表中除首次出现之外的所有字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50727826/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com