2016-04-30 2 views
4

При использовании в 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 
+1

ли объяснение [здесь] (http://stackoverflow.com/questions/34936593/overload-object-compare-when-add-to-a-set-in-julia) о хэшировании ответьте на свой вопрос? – DSM

+0

Спасибо, что указал мне на эту дискуссию. – InkPen

ответ

7

Как указано DSM, вам нужно просто добавить метод для hash для вашего типа, а именно:

hash(x::t, h) = hash(x.x2, hash(x.x1, h)) 
+0

Спасибо всем за вашу помощь. Я действительно следовал примеру, поставляемому с пакетом AutoHashEquals от Andrew Cooke. (https://github.com/andrewcooke/AutoHashEquals.jl) – InkPen

+0

Это хороший пакет, он упоминал проблему, если ваш тип не является неизменным, т. е. если вы меняете объект в 'Dict', он будет потерян (и 'Set' реализован как' Dict' в Julia). Это проблема для вас, или вы можете сделать ваши типы неизменными? Кроме того, он, похоже, не позволяет вам определять '==' и 'hash' только в подмножестве полей. –

Смежные вопросы