<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc=" http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>briancarper.net (λ) (Tag: Sorting)</title><link>http://briancarper.net/tag/154/sorting</link><description>Some guy's blog about programming and Linux and cows.</description><item><title>Sort a Clojure map by two or more keys</title><link>http://briancarper.net/blog/sort-a-clojure-map-by-two-or-more-keys</link><guid>http://briancarper.net/blog/sort-a-clojure-map-by-two-or-more-keys</guid><pubDate>Wed, 21 Oct 2009 02:23:30 -0700</pubDate><description>&lt;p&gt;Note to self.  Given this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user&amp;gt; (def x [{:foo 2 :bar 11}
              {:bar 99 :foo 1}
              {:bar 55 :foo 2}
              {:foo 1 :bar 77}])

#'user/x
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;How do you sort by &lt;code&gt;:foo&lt;/code&gt;, and where &lt;code&gt;:foo&lt;/code&gt; is equal, sort by &lt;code&gt;:bar&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Obviously not like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user&amp;gt; (sort x)
; Evaluation aborted.
;; java.lang.ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to java.lang.Comparable
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Also not like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user&amp;gt; (sort-by #(map % [:foo :bar]) x)
; Evaluation aborted.
;; java.lang.RuntimeException: java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Comparable
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What's a guy got to do to find something &lt;code&gt;Comparable&lt;/code&gt;?  Well, vectors are &lt;code&gt;Comparable&lt;/code&gt;, so we can do this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user&amp;gt; (sort-by #(vec (map % [:foo :bar])) x)
({:foo 1, :bar 77} {:bar 99, :foo 1} {:foo 2, :bar 11} {:bar 55, :foo 2})
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>
