Your comparator #(if (= %1 %2) 0 1) may happen to give the correct answers
for your example sorted-maps, but it is also a bad comparator that will
fail for larger examples:

user=> (:a (sorted-map-by #(if (= %1 %2) 0 1) :z -26 :b 1 :a 2 :c 3 :m 13
:h 8))
nil
user=> (:z (sorted-map-by #(if (= %1 %2) 0 1) :z -26 :b 1 :a 2 :c 3 :m 13
:h 8))
nil

That is because if two items are not =, by returning 1 you are telling the
caller "the first argument should come after the second argument".  Thus if
at some time the comparator is called as (cmp :a :z), and later it is
called as (cmp :z :a), it returns the inconsistent results that :a should
come after :z, and later that :z should come after :a.  No sorted tree can
hope to return correct results given such an inconsistent comparator.

More examples and discussion at the link below, if you are interested:


https://github.com/jafingerhut/thalia/blob/master/doc/other-topics/comparators.md

Andy


On Thu, Jun 6, 2013 at 4:19 AM, dennis zhuang <killme2...@gmail.com> wrote:

> Sorry, it's my mistake.
> Because treep map use the comparator to compare keys, and if the
> comparator returns 1 constantly,it can not find the item that equals the
> key.
>
> So i can modified the example,and it works:
>
> user=> (sorted-map-by #(if (= %1 %2) 0 1) :b 1 :a 2)
> {:b 1, :a 2}
> user=> (:a (sorted-map-by #(if (= %1 %2) 0 1) :b 1 :a 2))
> 2
> user=> (:b (sorted-map-by #(if (= %1 %2) 0 1) :b 1 :a 2))
> 1
>
>
> 2013/6/6 dennis zhuang <killme2...@gmail.com>
>
>> user=> (sorted-map-by (constantly 1) :b 1 :a 2)
>> {:b 1, :a 2}
>> user=> (:a (sorted-map-by (constantly 1) :b 1 :a 2))
>> nil
>> user=> (keys (sorted-map-by (constantly 1) :b 1 :a 2))
>> (:b :a)
>> user=> (count (sorted-map-by (constantly 1) :b 1 :a 2))
>> 2
>> user=> (:a (sorted-map-by (constantly 1) :b 1 :a 2))
>> nil
>>
>> It looks so strange.The result map has keys :a and :b,but i can't get
>> their values.
>> Why? I try to hack the code,but i can't find the reason.
>>
>>
>> --
>> 庄晓丹
>> Email:        killme2...@gmail.com xzhu...@avos.com
>> Site:           http://fnil.net
>> Twitter:      @killme2008
>>
>>
>>
>
>
> --
> 庄晓丹
> Email:        killme2...@gmail.com xzhu...@avos.com
> Site:           http://fnil.net
> Twitter:      @killme2008
>
>
>  --
> --
> You received this message because you are subscribed to the Google
> Groups "Clojure" group.
> To post to this group, send email to clojure@googlegroups.com
> Note that posts from new members are moderated - please be patient with
> your first post.
> To unsubscribe from this group, send email to
> clojure+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/clojure?hl=en
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clojure+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.
>
>
>

-- 
-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to