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! Thanks, Bill --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---