2016-09-27 2 views
-1

ich eine Karte von der Form habenGruppierung Elemente einen Schlüssel aus einer Karte in clojure mit

{[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]} 

ich gruppieren möchten den zweiten Schlüssel in bestimmten Bereichen wie

((1-5)(6-10)(11-15)..) 

Das Ergebnis

sein sollte
{{[3.0 4.0][7.0 3.0][1.0 4.0]} 
{[2.0 7.0][4.0 6.0][5.0 6.0][4.0 9.0]} 
{[5.0 11.0][4.0 16.0]}} 

Ich habe mit Peek implementiert, aber haben gescheitert. Wie kann ich dieses Ergebnis erreichen?

+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. ??? –

+0

@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

Antwort

0

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]]) 
+0

Was passiert, wenn das Ergebnis die gleichen Werte hat? Wie, (def-Daten # {[3,0 4,0] [3,0 4,0] [3,0 4,0] [2,0 7,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]}) – joey

+0

Eine Menge (definiert mit '# {...}' Syntax) kann keine Wiederholungswerte haben. Meinst du so etwas wie einen Vektorenvektor? '[[3 4] [3 4] [3 4] [2 7] ...]' ??? –

+0

ja..Ich habe tatsächlich das Ergebnis als der Vektor der Vektoren zuerst – joey

Verwandte Themen