在F#有没有办法来映射例如[2;2;2;2;5;5;5;7;7]以[4,3,2]无递归和无可变的?我查看了Array和List成员,发现了Reduce,但这似乎没有帮助.
Jac*_* P. 11
您可以使用快速实现它Seq.countBy.使用F#interactive,它看起来像这样:
> [2;2;2;2;5;5;5;7;7] |> Seq.countBy id;;
val it : seq<int * int> = seq [(2, 4); (5, 3); (7, 2)]
Run Code Online (Sandbox Code Playgroud)
如果您只想要计数(而不是重复的值),您只需将结果输入Seq.map:
> [2;2;2;2;5;5;5;7;7] |> Seq.countBy id |> Seq.map snd;;
val it : seq<int> = seq [4; 3; 2]
Run Code Online (Sandbox Code Playgroud)
请注意,您可以使用Seq.groupBy,但Seq.countBy效率更高:Seq.groupBy消耗更多内存,因为它必须存储所有组,而为序列中的每个键Seq.countBy只存储一个int(计数器).