2010-03-01 59 views
2

对于F#数组,有没有简单的方法来返回排序索引以及有序数组?F#从array.sort返回排序索引

就像从MATLAB的sort()功能?

背景:我来自MATLAB/R,其中操纵阵列上的索引是必要的。

我想重现一些索引功能,并试图能够通过周围指数数组中各种功能的变量。对于这个sort()函数,一个用法是根据它们中的任何一个将几个对齐的数组排列在一起。

也许有更好的方法来做到这一点?

回答

3

请使用Array.sort结合Array.mapi。

let arr = [| 14;3;11;2 |] 
let sortedWithIndex = arr |> Array.mapi (fun x t -> (t,x)) |> Array.sort 
printfn "%A" sortedWithIndex 

输出

[|(2, 3); (3, 1); (11, 2); (14, 0)|] 
+0

Array.sort不会返回排序的数组,但会返回'unit'。排序/压缩的顺序也是错误的。 – Dario 2010-03-01 18:55:57

+0

@Dario - Array.sort没有排序,它返回一个新的数组。恰当命名的'Array.sortInPlace'用于对数组进行排序。然而,你是正确的映射和排序顺序是错误的。 – kvb 2010-03-01 19:10:02

+0

我纠正了排序和映射的顺序。我实际上认为OP正在寻找在排序后应用的索引。好吧。现在修复。 @Dario:Array.sort没有排序。 – 2010-03-01 19:11:32

0
let sortWithIndex list = 
    list 
    |> List.mapi (fun index x -> (x, index)) 
    |> List.sort 

(根据F#的版本,List.sort可能需要像'比较比较功能)。

+0

最后一步“|> List.sort compare”在我的机器上给出错误: 错误FS0001:此表达式预计有 ('a * int)列表 - >'b 但是这里有类型 'c列表 – ahala 2010-03-01 19:09:28

+0

'List.sort'不带比较函数(并且因为你的元组的排序,不需要)。 – kvb 2010-03-01 19:10:44

+0

@kvb:在我的版本中它确实(1.9.6.2);) – Dario 2010-03-01 19:28:27