On Oct 27, 12:04 pm, "Bill Clementson" <[EMAIL PROTECTED]> wrote:
> Hi Chouser
>
> On Mon, Oct 27, 2008 at 8:46 AM, Chouser <[EMAIL PROTECTED]> wrote:
>
> > 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).
>
> Only that it allowed me to talk about Java interop in my blog post. ;-)
>
>
>
> > 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)))
>
> Oooh, very nice!
>

Here's a simple one with set ops:

(alias 'set 'clojure.set)

(defn set-xor [& sets]
  (second (reduce
           (fn [[all ret] s]
               [(set/union all s) (set/union (set/difference ret s)
(set/difference s all))])
           [#{} #{}] sets)))

(defn seq-xor [& seqs] (seq (apply set-xor (map set seqs))))

Rich
--~--~---------~--~----~------------~-------~--~----~
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