J'ai une liste de clés: Je veux une carte avec les valeurs définies sur 0 comme ceci: (1 2 3 4) code> p>
{1 0, 2 0, 3 0, 4 0} code>. Comment puis-je faire ça? P>
5 Réponses :
Vous pouvez faire quelque chose comme ceci avec la fonction ZipMap:
(zipmap '(1 2 3 4) (repeat 0))
=> {4 0, 3 0, 2 0, 1 0}
Dans ma fonction de carte d'origine, j'ai eu une fonction supplémentaire sur la clé. (MAP (FN [TOLE] (touche FOO) ..)
Cela ne devrait pas être un problème car la carte renvoie une séquence. Il suffit de remplacer '(1 2 3 4) avec la fonction de votre carte: par exemple. Si vous vouliez convertir les chiffres en une chaîne avant de les faire la clé: (ZipMap (carte # (STR%) '(1 2 3 4)) (répétez 0)) => {"4" 0, "3" 0, "3" 0, "3" 0 , "2" 0, "1" 0} Est-ce ce que vous voulez dire?
Vous pouvez également créer une fonction avec James 'ZipMap:
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}
Le modèle plus général pour cela est d'utiliser C'est beaucoup plus de travail. C'est pourquoi nous avons des fonctions d'emballage comme ZipMap. p> (liste de collecte d'appliquer code> pour créer la collection. Les collections de clojure ont tous des "constructeurs" ou des fonctions de création qui prennent un nombre variable d'arguments et retournent les arguments Fenoulé dans la collection. Si vos arguments sont déjà enveloppés dans une autre collection, appliquer est un moyen pratique de les sortir de la collection et de les transmettre à la fonction de création comme arguments. P>
wow je ne savais pas à propos de ZipMap, c'est utile
Je l'aurais fait comme ceci P>
Un autre moyen, ce qui conserve l'ordre d'origine des touches (jusqu'à 9 clés!): p>
(liste de lecture defn à la carte [& n]
(- >> (carte vecteur n (répéter 0))
(dans (mappe de hachage)))) code> p>
(liste-to-map 1 2 3 4) code> => {1 0, 2 0, 3 0, 4 0} code> p> p> P>
(liste-to-map 4 3 2 1) code> => {4 0, 3 0, 2 0, 1 0} code> p> p> P>
Surveillez: Les cartes de hash n'ont pas d'ordre défini, vous ne devriez donc jamais compter sur cela. La commande que vous voyez est coïncidente en raison de la mise en œuvre des cartes de hachage. Voyez ce qui se passe lorsque vous essayez avec 9 articles.
Oui, tu as raison. Il conserve la commande jusqu'à la 9. article, il a donc le même ordre jusqu'à 9 arguments! Connaissez-vous la raison?
Utilisez la fonction code> type code> pour voir le type résultant à 8 entrées et 9. Je pense que Clojure utilise une "carte de tableau" pour des cartes plus petites comme optimisation des performances. L'utilisation de petites cartes pour passer des bits de données autour est un cas d'utilisation commun où il n'est pas nécessaire d'utiliser les machines intelligentes de la carte de hachage persistante complète.