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