При использовании в Julia Set
композитного типа функция push!
, кажется, добавляет повторяющиеся элементы в набор. Читая стандартную документацию Julia, я предположил, что функция isequal
будет использоваться для проверки дубликатов. Наверное, я неправильно понял, так что, возможно, кто-то может мне помочь.Почему push!() Добавляет повторяющиеся элементы в Set?
В качестве примера см. Приведенный ниже код. В частности, я хотел бы знать, почему t2
добавлен в набор, несмотря на то, что он идентичен t1
.
Любая помощь очень ценится. Примечание. В моем случае две переменные типа t
считаются идентичными, если поля x1
и x2
равны; значения остальных полей не имеют значения.
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
ли объяснение [здесь] (http://stackoverflow.com/questions/34936593/overload-object-compare-when-add-to-a-set-in-julia) о хэшировании ответьте на свой вопрос? – DSM
Спасибо, что указал мне на эту дискуссию. – InkPen