I think it's generally better to use = instead of .equals for
equality, unless you have a specific reason to not use = (which I
don't think is the case here).

On Mon, Oct 27, 2008 at 11:12 AM, Stuart Halloway
<[EMAIL PROTECTED]> wrote:
>
> You could do something like this:
>
> (defn seq-xor-2-seqs
>   "Returns the unique values that are in one sequence but not the
> other."
>   [x y]
>   (let [x (into #{} x)
>        y (into #{} y)]
>     (lazy-cat (clojure.set/difference x y)
>              (clojure.set/difference y x))))
>
> Not sure this is more idiomatic, though.  And I guess it would perform
> worse with huge collections...

If I'm reading thing's correctly, Bill's solution is O(n^2), while
Stuart's is O(n*log(n)) or better.  It looks like difference iterates
over one seq and for each item does a lookup (nearly constant time) on
the the other, although copying into sets may use more memory.

By the way, difference is eager, so I'm not sure there's much point in
using lazy-cat. :-)

Here's another approach to do all the seqs at once:

(defn seq-xor
  "Returns unique values that are in one sequence but not the others."
  [& seqs]
  (let [obj-cnt (reduce (fn [acc s]
                          (merge-with + acc (into {} (for [i s] {i 1}))))
                        {} seqs)]
    (for [[obj cnt] obj-cnt :when (== cnt 1)]
      obj)))

--Chouser

--~--~---------~--~----~------------~-------~--~----~
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
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to