julia - Julia SortedSet 中的自定义排序

标签 julia

在 SortedSet 的 Julia 文档中,有一个对“排序对象”的引用,可以在构造函数中使用。我正在做一个项目,我需要在一组结构上实现自定义排序。我想为此使用仿函数,因为我需要额外的状态来进行比较。 这是我要解决的问题的简化版本。我有两个结构,Point 和 Edge:

struct Point{T<:Real}
    x::T
    y::T
end
struct Edge{T<:Real}
    first::Point{T}
    second::Point{T}
end

我有一个名为“优势”的,我想根据与“优势”的距离对进行排序。概念上:

function edge_ordering(vantage::Point, e1::Edge, e2::Edge)
    d1 = distance(vantage, e1)
    d2 = distance(vantage, e2)
    return d1 < d2
end

“排序对象”是仿函数(或仿函数)吗?在 Julia 中是否有其他一些传统的方式来进行这种排序?

最佳答案

Ordering 对象可以包含字段,您可以将状态存储在那里。这是一个余数排序的例子,它按余数对整数进行排序:

using DataStructures

struct RemainderOrdering <: Base.Order.Ordering
    r::Int
end

import Base.Order.lt
lt(o::RemainderOrdering, a, b) = isless(a % o.r, b % o.r)

SortedSet(RemainderOrdering(3), [1,2,3]) # 3, 1, 2

我不确定它与仿函数有什么关系,所以我可能会误解你的问题。这是定义 Ordering 仿函数的替代实现。我在评论中做了解释。

using DataStructures
import Base: isless, map

struct Foo # this is your structure
    x::Int
end

struct PrimaryOrdered{T, F} # this is the functor, F is the additional state.
    x::T
end

map(f::Base.Callable, x::T) where {T <: PrimaryOrdered} = T(f(x.x)) # this makes it a functor?
isless(x::PrimaryOrdered{T, F}, y::PrimaryOrdered{T, F}) where {T, F} =
    F(x.x) < F(y.x) # do comparison with your additional state, here I assume it is a closure

const OrderR3 = PrimaryOrdered{Foo, x -> x.x % 3} # a order that order by the remainder by 3

a = OrderR3(Foo(2))
f(x::Foo) = Foo(x.x + 1) # this is a Foo -> Foo
a = map(f, a) # you can map f on a OrderR3 object
a == OrderR3(Foo(33)) # true

a = map(OrderR3 ∘ Foo, [1, 2, 3])

s = SortedSet(a)

map(x->x.x, s) # Foo[3, 1, 2]

与往常一样,MWE 对于更好地理解问题很重要。您可以包含一段代码来显示您希望如何构造和使用您的 SortedSet,而不是含糊的“state”和“functor”。

关于julia - Julia SortedSet 中的自定义排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54312358/

相关文章:

dataframe - 为什么 map 在 DataArray 上操作时会丢弃类型信息?

dataframe - 如何在 Julia 中获取 DataFrame 的头部(head line)?

parallel-processing - 如何在第一个函数运行时调用第二个函数,反之亦然?

julia - 就地更新函数参数

julia - 参数返回类型

julia - 用线性/非线性回归拟合两条曲线

julia - 使用微分方程计算终端速度

julia - 增加 Plots.jl 中图例标签之间的间距/填充

julia - Julia 中的扫描等价物

eval - eval(Expr( :call, m.f,x)) 是好 Julia 吗?