同等价值和独特性

时间:2017-12-21 12:58:26

标签: unique julia

我有一个名为 Dyad 的自定义类型,它由两个变量 src dst 组成。我已经为dyads重新定义了等号,例如

Dyad(1,2) == Dyad(2,1)
>true

但是,如果我定义以下Dyad向量

d = [Dyad(1,2), Dyad(2,1)]
unique(d) == d
>true

我是否需要重新定义我的平等,以便 unique()明白这一点?

P.S这是我定义我的平等的方式:

==(x::Dyad, y::Dyad) = (x.src == y.src && x.dst == y.dst) || (x.src == y.dst && x.dst == y.src)

2 个答案:

答案 0 :(得分:3)

hash定义Dyad可能更简单: hash(x::Dyad, h::UInt) = hash(minmax(x.src, x.dst), h) 得到你想要的。通过这种方式,您可以确保在过程中使用hash测试相等性的所有函数都能正常工作。

编辑:minmax将优于extrema

答案 1 :(得分:2)

我不确定我能解释得多好但我会试一试。

基本上unique迭代你给它的所有值,并测试value in seen_values(如果不是,则将值附加到要返回的值列表中)。但是,此处的seen_values类型为Set,而in(x, s::Set)的定义与in(x, a::AbstractArray)不同。在Set in==版中,in运算符不用于定义相等性。为了解决这个问题,我们可以为Dyad类型定义Base的专用版本。请参阅下面的代码(它还将显示type Dyad src::Int dst::Int end import Base.== ==(x::Dyad, y::Dyad) = (x.src == y.src && x.dst == y.dst) || (x.src == y.dst && x.dst == y.src) d = [Dyad(1,2), Dyad(2,1)] # @show unique(d) # hmmm... if you uncomment this line it won't work # (I guess because unique will be already compiled...) @show in(d[1], [d[2]]) @which in(d[1], [d[2]]) @show in(d[1], Set([d[2]])) @which in(d[1], Set([d[2]])) import Base.in in(x::Dyad, s::Set) = any(y->y==x, s) @show unique(d) ## Yay! it works 源代码中的相关行。)

pairlist(X,Y)