Sie verwirren das Ergebnis Ihrer vorherigen Frage. Die Ausgabe dieser Frage (und die Eingabe in diese Frage) ist eine Menge wie # {...}, keine Map wie {...}. Jedes Element der Menge ist ein Länge-2-Vektor wie [3 4].
Die einfachste Lösung ist, wie so jeden Suchbereich filtern:
(ns clj.core
(:require [tupelo.core :as t]
[datascript.core :as d]
[clojure.set :as set]))
(t/refer-tupelo)
(def data
#{ [3.0 4.0] [2.0 7.0] [7.0 3.0] [4.0 6.0] [1.0 4.0] [5.0 6.0] [4.0 9.0] [5.0 11.0] [4.0 16.0] })
(println "1-5:" (filter #(<= 1 (second %) 5) data))
;=> 1-5: ([3.0 4.0] [1.0 4.0] [7.0 3.0])
oder wir könnten eine Schleife schreiben:
(newline)
(doseq [idx (range 5)]
(let [upper (* (inc idx) 5)
lower (- upper 4) ]
(print (format "[%d..%d] => " lower upper))
(println (filter #(<= 1 (second %) 5) data))))
[1..5] => ([3.0 4.0] [1.0 4.0] [7.0 3.0])
[6..10] => ([4.0 9.0] [2.0 7.0] [4.0 6.0] [5.0 6.0])
[11..15] => ([5.0 11.0])
[16..20] => ([4.0 16.0])
[21..25] =>()
Bitte beachte, dass ich die Daten festgelegt, so dass es ein Satz ist, keine Karte.
Sie könnten auch group-by
verwenden:
(def result4 (into (sorted-map)
(group-by #(-> % second dec (quot 5)) data)))
(newline)
(pretty result4)
{0.0 [[3.0 4.0] [1.0 4.0] [7.0 3.0]],
1.0 [[4.0 9.0] [2.0 7.0] [4.0 6.0] [5.0 6.0]],
2.0 [[5.0 11.0]],
3.0 [[4.0 16.0]]}
und Sie können die Werte herausziehen wie
(newline)
(pp/pprint (vals result4))
([[3.0 4.0] [1.0 4.0] [7.0 3.0]]
[[4.0 9.0] [2.0 7.0] [4.0 6.0] [5.0 6.0]]
[[5.0 11.0]]
[[4.0 16.0]])
Ich bin ein wenig verwirrt, wie Du diese Karte sind zu schaffen. Was sind die Schlüssel in der Karte? Ich dachte, eine Karte müsste eine gerade Anzahl von Elementen haben, aber Sie zeigen eine Karte mit einer ungeraden Anzahl von Elementen. ??? –
@BobJarvis http://stackoverflow.com/questions/39712460/how-to-map-different-values-from-2-sets-in-clojure-based-on-unique-value/39714081?noredirect=1#comment66726590_39714081 – joey