「数字混じりソート」さらに改
昨日のコードを更に改造。
(use '[clojure.contrib.str-utils :only (re-partition)] '[clojure.contrib.core :only (-?>)]) (defn apply-flip [f a b] (f b a)) (defn parse [s] (->> (re-partition #"\d+" s) (apply-flip concat [nil nil]) (partition 2) (mapcat (juxt first #(-?> % second Integer/parseInt))))) (defn mixed-compare [parse a b] (->> (map list (parse a) (parse b)) (drop-while (fn [[x y]] (and (= x y) (-> x nil? not)))) first (apply compare))) (defn mixed-sort [xs] (sort (partial mixed-compare parse) xs)) (defn memoized-mixed-sort [xs] (sort (partial mixed-compare (memoize parse)) xs))
これまでは parse の返すコレクションを丸ごと compare へ渡す方針でやってましたが、今回はコレクションの要素を順に compare してみました。 ではなく、コレクションの要素を順に比較して、異なる要素を見付けたところで compare を適用しています。
何となく無駄が無くなったような気はしますが、パフォーマンス的にはあんまり変ってないようです。