2009-10-07 13 views

Antwort

15

Sie könnten mit der zipmap Funktion so etwas tun:

(zipmap '(1 2 3 4) (repeat 0)) 
=> {4 0, 3 0, 2 0, 1 0} 

zipmap nimmt eine Liste von Schlüsseln und eine Liste von Werten und wandelt sie in eine Karte. Die repeat Funktion erstellt eine unendliche Folge von 0s. zipmap stoppt, wenn das Ende der kürzeren Liste erreicht, also nicht passieren einfach nicht zwei unendliche Folgen :)

+0

In meiner ursprünglichen Kartenfunktion hatte ich eine zusätzliche Funktion auf dem Schlüssel. (map (fn [key] (foo key) ..) .. Gibt es eine Möglichkeit, diese Funktion in die zipmap einzubinden oder sollte ich die Funktion einfach anwenden, bevor ich zipmap verwende? – unj2

+0

Es sollte kein Problem sein, da Map zurückkehrt eine Sequenz ersetzen Sie einfach '(1 2 3 4) durch Ihre Kartenfunktion: zB wenn Sie die Zahlen in eine Zeichenkette konvertieren wollten, bevor Sie sie zum Schlüssel machen: (zipmap (map # (str%)' (1 2 3 4)) (wiederhole 0)) => {"4" 0, "3" 0, "2" 0, "1" 0} Meinst du das? –

1

Sie auch eine Funktion mit James' zipmap erstellen:

Clojure=> (defn map-to-n [n] (zipmap (range 1 n) (repeat 0))) 
#'user/map-to-n 
Clojure=> (map-to-n 10) 
{9 0, 8 0, 7 0, 6 0, 5 0, 4 0, 3 0, 2 0, 1 0} 
1

Die allgemeinere Muster Dazu verwenden Sie (apply collection list, um die Sammlung zu erstellen. Die Clojure-Sammlungen haben alle "Konstruktoren" oder Erstellungsfunktionen, die eine variable Anzahl von Argumenten annehmen und die in der Sammlung gebündelten Argumente zurückgeben. Wenn Ihre Argumente bereits in einer anderen Sammlung enthalten sind, können Sie sie mithilfe der Anwendung apply aus der Sammlung entfernen und als Argumente an die Erstellungsfunktion übergeben.

Das ist viel mehr Arbeit. Aus diesem Grund haben wir Wrapper-Funktionen wie zipmap.

1

Wow ich wusste nicht, über zipmap, das ist nützlich

ich es getan hätte, wie diese

(apply hash-map (interleave '(1 2 3 4) (repeat 0))) 
0

nur eine andere Art, die die ursprüngliche Reihenfolge der Tasten (bis zu 9 Tasten behält !):

(defn list-to-map [& n] (->> (map vector n (repeat 0)) (into (hash-map))))

(list-to-map 1 2 3 4) =>{1 0, 2 0, 3 0, 4 0}

(list-to-map 4 3 2 1) =>{4 0, 3 0, 2 0, 1 0}

+0

Achtung: Hash Maps haben keine Definierte Reihenfolge, also sollten Sie sich nie darauf verlassen. Die Reihenfolge, die Sie sehen, ist zufällig aufgrund der Implementierung von Hash-Maps. Sehen Sie, was passiert, wenn Sie das mit 9 Elementen versuchen. – TheQuickBrownFox

+0

Ja, Sie haben Recht. Es behält die Reihenfolge bis zum 9 . Artikel, so hat es die gleiche Reihenfolge bis zu 9 Argumente! Kennst du die Reas auf? – amirteymuri

+0

Verwenden Sie die 'type'-Funktion, um den resultierenden Typ bei 8 Einträgen und 9 zu sehen. Ich glaube, dass Clojure eine" Array-Map "für kleinere Karten als Leistungsoptimierung verwendet. Die Verwendung kleiner Karten zum Übergeben von Datenbits ist ein häufiger Anwendungsfall, bei dem die clevere Maschinerie der vollständigen persistenten Hash-Karte nicht verwendet werden muss. – TheQuickBrownFox

Verwandte Themen