Julia 为什么推!()是否向集合中添加重复元素?
在Julia中使用组合类型的Julia 为什么推!()是否向集合中添加重复元素?,julia,Julia,在Julia中使用组合类型的集时,推函数似乎将重复项添加到集合中。在阅读Julia标准文档时,我假设将使用isequal函数来测试重复项。我想我误解了,也许有人能帮我 作为示例,请参见下面的代码。特别是,我想知道为什么将t2添加到集合中,尽管它与t1相同 非常感谢您的帮助。注:在我的情况下,如果x1和x2字段相等,则类型为t的两个变量被视为相同;其余字段的值无关紧要 type t x1::Float64 x2::Float64 b1::Bool b2::Bool end
集时,推代码>函数似乎将重复项添加到集合中。在阅读Julia标准文档时,我假设将使用isequal
函数来测试重复项。我想我误解了,也许有人能帮我
作为示例,请参见下面的代码。特别是,我想知道为什么将t2
添加到集合中,尽管它与t1
相同
非常感谢您的帮助。注:在我的情况下,如果x1
和x2
字段相等,则类型为t
的两个变量被视为相同;其余字段的值无关紧要
type t
x1::Float64
x2::Float64
b1::Bool
b2::Bool
end
isequal( tx::t, ty::t) = (tx.x1 == ty.x1) && (tx.x2 == ty.x2)
==(tx::t, ty::t) = (tx.x1 == ty.x1) && (tx.x2 == ty.x2)
t1 = t( 1, 2, true, true)
t2 = t( 1, 2, true, true)
tc = t1
tdc = deepcopy( t1)
[ t1 == t2 isequal( t1, t2)] # ---> [ true true ]
[ t1 == tc isequal( t1, tc)] # ---> [ true true ]
[ t1 == tdc isequal( t1, tdc)] # ---> [ true true ]
s = Set{t}()
push!( s, t1)
push!( s, t2) # adds t2 to the set although t2 and t1 are identical ...
push!( s, tc) # does not add ...
push!( s, tdc) # adds tdc although tdc and t1 are identical
正如DSM所指出的,您只需为您的类型添加一个哈希
方法,即:
hash(x::t, h) = hash(x.x2, hash(x.x1, h))
关于散列的解释回答了你的问题吗?谢谢你给我指点那个讨论。谢谢大家的帮助。我实际上遵循了Andrew Cooke的AutoHashEquals包提供的示例。()这是一个很好的包,它确实提到了如果您的类型不是不可变的问题,即如果您在Dict
中更改一个对象,它将丢失(并且Set
在Julia中实现为Dict
)。这是您的问题,还是您可以使您的类型不可变?而且,它似乎不允许您仅在字段的子集上定义=
和散列。