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

配列があなたの中にあると仮定すると、arrあなたはただすることができます

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」は関数合成であり、「apply a then apply b」のように、「fx = b(a(x))となる関数fを作成する」を意味します。 >> b >> c>>..。

注2:「@」は、[1..100] = [1..12] @ [13..50] @ [51..89] @ [90..100]のように、リストの連結です。これは、一度に1つの要素のみを追加でき、リストの先頭にのみ追加できる短所 "::"よりも強力ですが、効率が低くなります。a:: [b; c; d] = [a; b; c ; d]

注3:List.filter(fun e-> ...)式は、提供されたフィルタリングラムダを保持する「カリー化関数」バージョンを生成します。

注4:関数の代わりに「小さい」リストと「大きい」リストを作成することもできます(「xs |> filter |> sort」のように)。それらを機能させるための私の選択は恣意的でした。

注5:sortData関数の型アノテーションは、それが必要であると述べており、要素が比較をサポートするリストを返します。

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

注6:簡潔さには明確さがあります(この特定の投稿にもかかわらず:))

于 2014-03-24T14:11:39.950 に答える
1

関数型言語のアルゴリズムの明確さの証拠として、上記のフィルターソートの次の最適化は3倍高速です(VS Test Explorerによって報告されたように)。この場合、リストはピボット(最初の要素)ごとに1回だけトラバースされ、小さいアイテムと大きいアイテムのサブリストが生成されます。また、さらなる比較から離れて一致する要素を収集する同等性リストが導入されています。

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 に答える