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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---