2

我有一个这样的数组,

[|{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;};
  .......
    |]

如何根据“营业额”对该数组进行排序?谢谢(没有太多上下文来解释代码部分?我应该写多少上下文)

4

3 回答 3

8

Assuming that the array is in arr you can just do

arr |> Array.sortBy (fun t -> t.turnover)
于 2013-01-07T02:16:23.423 回答
2

我知道这已经得到了很好的回答;但是,我发现,像 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 更强大但效率更低, "::" 一次只能添加一个元素,并且只能添加到列表的头部,a::[b;c;d] = [a;b;c ;d]

注 3:List.filter (fun e ->...) 表达式产生一个“柯里化函数”版本,包含提供的过滤 lambda。

注 4:我可以制作“更小”和“更大”的列表而不是函数(如“xs |> filter |> sort”)。我选择让它们发挥作用是任意的。

注 5:sortData 函数的类型签名声明它需要并返回一个列表,其元素支持比较:

_arg1:'a list -> 'a list when 'a : comparison 

注6:简洁明了(尽管有这个特殊的帖子:))

于 2014-03-24T14:11:39.950 回答
1

作为函数式语言算法清晰性的证明,上述过滤器排序的以下优化速度提高了三倍(由 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)
于 2014-04-04T19:17:51.813 回答