【问题标题】:F# return sorting indices from array.sortF# 从 array.sort 返回排序索引
【发布时间】:2010-03-01 18:36:39
【问题描述】:

对于 F# 数组,是否有一种简单的方法可以将排序索引与排序后的数组一起返回?

喜欢 Matlab 中的 sort() 函数吗?

背景:我来自 matlab/R,在索引上操作数组是必不可少的。

我想重现一些索引函数并尝试能够将索引数组作为变量传递给各种函数。对于这个sort() 函数,一种用法是根据其中的任何一个将多个对齐的数组排序在一起。

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

【问题讨论】:

    标签: f# functional-programming


    【解决方案1】:

    将 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)|]
    

    【讨论】:

    • Array.sort 不返回排序后的数组,而是返回unit。排序/压缩的顺序也是错误的。
    • @Dario - Array.sort 没有就地排序,它返回一个新数组。恰当地命名为Array.sortInPlace 用于对数组进行就地排序。但是,您对映射和排序顺序错误的看法是正确的。
    • 我已经更正了排序和映射的顺序。我实际上认为 OP 正在寻找排序后要应用的索引。那好吧。现在修好了。 @Dario:Array.sort 没有就地排序。
    • 在 F# 1.9.6.2 中确实如此;)好吧,那没关系
    • 我猜你需要反转 x 和 t: Array.mapi (fun x t -> (t,x)) ?
    【解决方案2】:
    let sortWithIndex list =
        list
        |> List.mapi (fun index x -> (x, index))
        |> List.sort
    

    (根据 F# 的版本,List.sort 可能需要一个比较函数,如 `compare )。

    【讨论】:

    • 最后一步 "|> List.sort compare" 在我的机器上给出错误:错误 FS0001: This expression was expected to have type ('a * int) list -> 'b but here has type 'c 列表
    • List.sort 不带比较功能(并且由于您的元组的顺序,不需要比较功能)。
    • @kvb:在我的版本中是这样 (1.9.6.2) ;)
    • 很公平。在 1.9.9.9 中,具有该签名的函数是 List.sortWith
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多