[英]F# sorting array
我有一个像这样的数组
[|{Name = "000016.SZ";
turnover = 3191591006.0;
MV = 34462194.8;};
{Name = "000019.SZ";
turnover = 2316868899.0;
MV = 18438461.48;};
{Name = "000020.SZ";
turnover = 1268882399.0;
MV = 7392964.366;};
.......
|]
如何根据“营业额”对该数组进行排序? 谢谢(没有太多上下文可以解释代码部分?我应该写多少上下文)
假设数组在arr
您可以执行以下操作
arr |> Array.sortBy (fun t -> t.turnover)
我知道这已经得到了很好的回答。 但是,我发现,就像Haskell一样,F#与我的想法相符,并认为我会将其添加给其他新手:)
let rec sortData =
function
| [] -> []
| x :: xs ->
let smaller = List.filter (fun e -> e <= x) >> sortData
let larger = List.filter (fun e -> e > x) >> sortData
smaller xs @ [ x ] @ larger xs
注1:“ a >> b”是函数组成,表示“创建函数f,以使fx = b(a(x())”,如“应用a然后应用b”中所示,依此类推,如果继续:a >> b >> c >> ...
注意2:“ @”是列表连接,如[1..100] = [1..12] @ [13..50] @ [51..89] @ [90..100]。 这比cons“ ::”功能更强大,但效率更低。cons::一次只能添加一个元素,并且只能添加到列表的开头,即a :: [b; c; d] = [a; b; c ; d]
注意3:List.filter(fun e-> ...)表达式会生成一个“ curried function”版本,其中包含提供的过滤lambda。
注4:我本可以创建“较小”和“较大”列表,而不是函数(如“ xs |> filter |> sort”)。 我选择使它们起作用是任意的。
注5:sortData函数的类型签名说明它需要并返回其元素支持比较的列表:
_arg1:'a list -> 'a list when 'a : comparison
注意6:简洁明了(尽管有此特定帖子:))
为了证明功能语言的算法清晰性,上述筛选器排序的以下优化速度提高了三倍(如VS Test Explorer所报道)。 在这种情况下,每个枢轴(第一个元素)仅遍历该列表一次,以生成较小和较大项目的子列表。 而且,引入了等效列表,该列表从进一步的比较中收集匹配元素。
let rec sort3 =
function
| [] -> []
| x::xs ->
let accum tot y =
match tot with
| (a,b,c) when y < x -> (y::a,b,c)
| (a,b,c) when y = x -> (a,y::b,c)
| (a,b,c) -> (a,b,y::c)
let (a,b,c) = List.fold accum ([],[x],[]) xs
(sort3 a) @ b @ (sort3 c)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.