Это лучший способ преобразовать карту Java в собственную карту Clojure для целей сортировки? - PullRequest
1 голос
/ 02 января 2012

Если это лучшее (или хорошее) решение, может кто-нибудь объяснить, что именно он делает?

(sort
  (reduce (fn [x [y z]] (assoc x y z)) {} (System/getProperties)))

Где его можно использовать, например, для печати свойств системы:

(def p
  (sort
    (reduce (fn [x [y z]] (assoc x y z)) {} (System/getProperties))))

(defn pnv [nv] (println (str (key nv) "=\"" (val nv) "\"")))

(doseq [nv p] (pnv nv))

Если это не очень хороший подход, пожалуйста, предоставьте лучший. Спасибо

Я знаю, что могу сделать:

(doseq [nv (System/getProperties)] (pnv nv))

Но сортировка не работает:

(doseq [nv (sort (System/getProperties))] (pnv nv))
ClassCastException java.util.Hashtable$Entry cannot be cast to java.lang.Comparable  clojure.lang.Util.compare (Util.java:104)

Решение , предоставленное amalloy :

(doseq [nv (into (sorted-map) (System/getProperties))] (pnv nv))

1 Ответ

5 голосов
/ 02 января 2012

Карты, как правило, не отсортированы - конечно, любая карта, к которой вы добавите записи в {}, не будет.Тем не менее, и Clojure, и Java предоставляют отсортированные карты.Поэтому, если вам нужна отсортированная карта с порядком сортировки по умолчанию, вы можете просто сделать (into (sorted-map) the-other-map).Это работает как для java.util.Map, так и для типов Clojure, поэтому это должно быть все, что вам нужно.

...