簡體   English   中英

F#排序數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM