4 Stimmen

Clojure Prioritäts-Map

Ich habe folgendes,

(let [t (priority-map-by (comparator (fn [[f1 _] [f2 _]]
                                       (< f1 f2)))
                         :b [8 [2 1]])]

  (assoc t :c [8 [2 3]]))

Aus irgendeinem Grund wird das zugeordnete Element :c nach dem Hinzufügen zur Karte geändert, was ich bekomme, ist,

{:c [8 [2 1]], :b [8 [2 1]]}

was ich erwarte ist,

{:c [8 [2 3]], :b [8 [2 1]]}

Fehlt mir etwas Offensichtliches? Warum wird der Wert des Elements geändert? Oder ist das ein Bug?

1voto

Hamza Yerlikaya Punkte 48319

Ich habe bekommen, was ich wollte, indem ich keinen Vergleicher benutzt habe und je nach Bedingung -1, 0 oder 1 zurückgegeben habe.

(let [t (priority-map-by (fn [x y]
                             (if (= x y)
                               0
                               (let [[f1 _] x
                                     [f2 _] y]
                                 (if (< f1 f2) -1 1))))

                         :b [8 [2 1]])]

  (assoc t :c [8 [2 3]]))

das gibt mir, was ich will,

{:b [8 [2 1]], :c [8 [2 3]]}

0voto

Justin Kramer Punkte 3953

Beim Betrachten der Implementierung von priority-map-by scheint es, dass sie auf sorted-map-by basiert, das besagt, dass Schlüssel, die gleich verglichen werden, gleich sind. Zum Beispiel:

(sorted-map-by (fn [[a] [b]] (< a b)) [1 2] :foo [1 3] :bar)
=> {[1 2] :bar}

Dies gilt auch für sorted-set-by:

(sorted-set-by (fn [[a] [b]] (< a b)) [1 2] [1 3] [3 4])
=> #{[1 2] [3 4]}

Ob dieses Verhalten für priority-map-by beabsichtigt ist, müssten Sie den Autor fragen. Ich denke, es ist vernünftig.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X