2009-07-14 10 views
5

ich mit Listen in Clojure ein bisschen Schwierigkeiten habe Ich habe eine kurze Frage über die FilterfunktionFilter für Listen in Clojure

Sagen wir, ich habe eine Liste bestehend aus Karten Mein Code ist:

(def Person {:name Bob }) 
(def Person2 {:name Eric }) 
(def Person3 {:name Tim }) 
(def mylist (list Person Person2 Person3))

Wie würde ich mich über meine Liste filtern, so dass zum Beispiel: ich habe die Liste minus Person2 (Bedeutung minus jede Karte, die :name Eric hat) will

Vielen Dank an alle, mir helfen. Dies ist meine letzte Frage, die ich

versprechen

Antwort

3

Angenommen, Sie so etwas wie dieses:

(def Person {:name "Bob" }) 
(def Person2 {:name "Eric" }) 
(def Person3 {:name "Tim" }) 
(def mylist (list Person Person2 Person3)) 

Dies funktionieren würde:

(filter #(not= "Eric" (get % :name)) mylist) 
15

Zu diesem Zweck ist es besser, die ‚entfernen‘ Funktion zu verwenden. Es nimmt eine Sequenz und entfernt Elemente, für die das Prädikat 'wahr' zurückgibt. Es ist im Grunde das Gegenteil von Filter. Hier ist ein Beispiel dafür und die Verwendung des Filters für dieselben Zwecke, die ich über die REPL bearbeitet habe.

 
user> (def m1 {:name "eric" :age 32}) 
#'user/m1 
user> (def m2 {:name "Rayne" :age 15}) 
#'user/m2 
user> (def m3 {:name "connie" :age 44}) 
#'user/m3 
user> (def mylist (list m1 m2 m3)) 
#'user/mylist 
user> (filter #(not= (:name %) "eric") mylist) 
({:name "eric", :age 32}) 
user> (remove #(= (:name %) "eric") mylist) 
({:name "Rayne", :age 15} {:name "connie", :age 44}) 

Wie Sie sehen können, ist remove ein wenig sauberer, weil Sie nicht not = verwenden müssen. Wenn Sie mit Karten arbeiten, müssen Sie die Funktion "get" nicht verwenden, es sei denn, Sie möchten etwas Spezielles zurückgeben, wenn sich ein Schlüssel nicht in der Karte befindet. Wenn Sie wissen, dass der gesuchte Schlüssel in der Karte enthalten ist, gibt es keinen Grund, 'get' zu verwenden. Viel Glück!