2009-10-07 16 views

Odpowiedz

15

Można zrobić coś takiego z funkcją zipmap:

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

zipmap pobiera listę kluczy i listę wartości i konwertuje je na mapie. Funkcja repeat tworzy nieskończoną sekwencję 0s. zipmap zatrzymuje się, gdy osiągnie koniec krótszej listy, więc po prostu nie przechodzi on dwa nieskończone sekwencje :)

+0

W mojej oryginalnej funkcji map, miałem dodatkową funkcję na kluczu. (map (fn [key] (key foo) ..) .. czy istnieje sposób włączenia tej funkcji do zipmap lub powinienem zastosować tę funkcję zanim użyję zipmap? – unj2

+0

To nie powinno być problemem, ponieważ mapa zwraca Po prostu zamień "(1 2 3 4) na swoją funkcję mapowania: np. jeśli chcesz przekonwertować liczby na ciąg przed zrobieniem klucza: (zipmap (mapa # (str%)" (1 2 3 4)) (powtórz 0)) => {"4" 0, "3" 0, "2" 0, "1" 0} Czy to masz na myśli? –

1

Można również utworzyć funkcję z zipmap Jamesa:

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

Bardziej ogólny wzór w tym celu należy użyć kolekcji (apply collection list. Wszystkie zbiory Clojure mają "konstruktory" lub funkcje tworzenia, które pobierają zmienną liczbę argumentów i zwracają argumenty thows w pakiecie w kolekcji. jeśli twoje argumenty są już zapakowane w inną kolekcję, to zastosowanie jest wygodnym sposobem na wyjęcie ich z kolekcji i przekazanie do funkcji tworzenia jako argumenty.

To jest dużo więcej pracy. dlatego mamy funkcje opakowania, takie jak zipmap.

1

Wow nie wiedziałem o zipmap, to jest przydatna

zrobiłbym to jak to

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

tylko kolejny sposób, który zachowuje oryginalną kolejność kluczy (maksymalnie 9 klawiszy !):

(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

Uwaga: mapy skrótów nie mają zdefiniowana kolejność więc nigdy nie należy polegać na tym. Zamawiający widzisz jest przypadkowe ze względu na realizację mapy hash. Zobacz, co się dzieje, kiedy spróbować z 9 pozycji. – TheQuickBrownFox

+0

Tak masz rację. to zachowuje kolejność aż 9 item, więc ma tę samą kolejność aż do 9 argumentów! Czy znasz reas na? – amirteymuri

+0

Użyj funkcji 'type', aby zobaczyć wynikowy typ przy 8 wpisach i 9. Wierzę, że Clojure używa" mapy tablicowej "dla mniejszych map jako optymalizacji wydajności. Używanie małych map do przekazywania bitów danych jest powszechnym przypadkiem, w którym nie ma potrzeby używania sprytnej maszyny z całej trwałej mapy hash. – TheQuickBrownFox

Powiązane problemy