【问题标题】:ClojureScript array-map and sorted-map-by bug?ClojureScript 数组映射和排序映射错误?
【发布时间】:2015-07-25 01:06:48
【问题描述】:
(let [mymap (into {} (for [x (shuffle (rest (clojure.string/split "abcdefghijklmnopqrstuvwxyz" #"")))]
                       {x {:idx (rand-int 24)}}))]
  (into (sorted-map-by (fn [k1 k2]
                         (compare [(get-in mymap [k1 :idx]) k1]
                                  [(get-in mymap [k2 :idx]) k2])))
        mymap))

(let [mymap (into {} (for [x (shuffle (rest (clojure.string/split "abcdefghijklmnopqrstuvwxyz" #"")))]
                       {x {:idx (rand-int 24)}}))]
  (->> mymap
       (sort-by (fn [[_ m]] (:idx m)))
       (into (array-map))))

=> {"d" {:idx 22}, "n" {:idx 22}, "z" {:idx 14}, "w" {:idx 11}, "s" {:idx 17} , "f" {:idx 20}, "e" {:idx 19}, "q" {:idx 12}, "p" {:idx 10}, "j" {:idx 0}, "x" { :idx 20}, "v" {:idx 14}, "a" {:idx 1}, "t" {:idx 13}, "i" {:idx 21}, "k" {:idx 16}, "b" {:idx 23}, "r" {:idx 3}, "y" {:idx 18}, "g" {:idx 0}, "l" {:idx 16}, "u" {: idx 20}, "h" {:idx 10}, "m" {:idx 16}, "o" {:idx 11}, "c" {:idx 4}}

如果我们将数量限制为 8 是可以的。

(let [mymap (into {} (for [x (shuffle (rest (clojure.string/split "abcdefghijklmnopqrstuvwxyz" #"")))]
                       {x (rand-int 24)}))]
  (into (sorted-map-by (fn [k1 k2]
                         (compare [(get mymap k1) k1]
                                  [(get mymap k2) k2])))
        (take 8 mymap)))

{"z" {:idx 1}, "q" {:idx 6}, "n" {:idx 7}, "s" {:idx 7}, "f" {:idx 9}, " d" {:idx 17}, "w" {:idx 18}, "e" {:idx 21}}

可能与Clojurescript Array-Map order相关联

【问题讨论】:

  • 问题是什么?
  • 这是一个大问题。

标签: clojure clojurescript


【解决方案1】:

您使用的是哪个版本的 clojurescript? cljs 0.0-3308 中的第一个表单保持您期望的排序顺序:

    (println *clojurescript-version*) ;=>  "0.0-3308"

    (let [mymap (into {} (for [x (shuffle (rest (clojure.string/split "abcdefghijklmnopqrstuvwxyz" #"")))]
                           {x {:idx (rand-int 24)}}))]
      (into (sorted-map-by (fn [k1 k2]
                             (compare [(get-in mymap [k1 :idx]) k1]
                                      [(get-in mymap [k2 :idx]) k2])))
            mymap))
    ;=> {"d" {:idx 0}, "i" {:idx 0}, "w" {:idx 5}, "n" {:idx 6}, "q" {:idx 9}, "y" {:idx 9}, "k" {:idx 10}, "m" {:idx 10}, "x" {:idx 10}, "c" {:idx 12}, "h" {:idx 12}, "l" {:idx 13}, "v" {:idx 14}, "s" {:idx 15}, "z" {:idx 16}, "j" {:idx 17}, "p" {:idx 17}, "t" {:idx 17}, "o" {:idx 18}, "r" {:idx 19}, "b" {:idx 20}, "e" {:idx 20}, "a" {:idx 21}, "f" {:idx 21}, "g" {:idx 22}, "u" {:idx 23}}

您使用的是早于 2411 的版本吗?这是第一个版本,其中包含对您链接的问题的答案中解释的问题的修复。它已在 this commit 上得到修复,它在 2411 版本中首次发布。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2020-01-31
    • 1970-01-01
    • 2015-12-21
    相关资源
    最近更新 更多