2017-11-19 4 views
0

Ich bin ziemlich neu zu Clojure und nur einige Prüfungsfragen üben, um sich auf eine Abschlussprüfung vorzubereiten.Zählen Sie die Häufigkeit einer Zeichenfolge in der Karte in clojure

Ich versuche, die Häufigkeit aller Namen in einer Datei zu finden. Ich lese die Datei Zeile für Zeile und ich speichere jede Zeichenfolge, wenn sie ein bestimmtes Schlüsselwort in einer Karte enthält. Da ich keine Wiederholungen möchte, versuche ich klarzustellen, aber ich bekomme immer noch die sich wiederholenden Elemente.

(defn readFile [] 
    (map (fn [line] (clojure.string/split line #";")) 
    (with-open [rdr (reader "C:/Users/Rohil's Computer/Desktop/textfile.txt")] 
     (doseq [[idx line] (map-indexed vector(line-seq rdr))] 

     (if(.contains line "2007") 
      (if(.contains line "May") 
      (if(not(.contains line "Batman")) 
       (map save [(nth(clojure.string/split line #";")3 (nth(clojure.string/split line #";")19)]) 
       (distinct(map)) 
      ) 
     ) 
     ) 
    ) 
    ) 
) 
) 

Hier ist meine Beispielausgabe: Ich mag die 2 Iron Man Elemente loszuwerden.

(May 2007 Spiderman) 
Clojure2.clj: 
(March 2007 Iron man) 
Clojure2.clj: 
(March 2007 Iron man) 
Clojure2.clj: 
(April 2007 Captain America) 

Gibt es etwas, das ich vermisse?

+3

Ohne alles wegzugeben, hier ist ein paar Orte zu verbessern: 1. 'distinct' nimmt eine Sammlung. Sie übergeben ihm die 'map'-Funktion, deshalb erhalten Sie nicht, was Sie hoffen. 2. Es ist unwahrscheinlich, dass die beste Antwort auf verschachtelte 'if'-Anweisungen besteht. Versuchen Sie, die Werte, die Sie testen möchten, in einen Vektor zu setzen und iterieren Sie diese dann gegen Ihre Funktion. 3. Überlegen Sie, ob Sie Ihre Funktion in kleinere Teile aufteilen. – jmargolisvt

Antwort

2

Mit Clojure ist es ein guter Ansatz, das, was Sie benötigen, um eine Aufgabe in Funktionen, die so einfach wie möglich sind, zu erfüllen. Sobald Sie diese einfachen Funktionen geschrieben und getestet haben, können Sie sie kombinieren. Oft die einfache Funktion benötigen Sie bereits vorhanden ist, wie hier der Fall ist mit frequencies:

(frequencies ["foo" "bar" "foo" "quux" "foo"]) 
=> {"foo" 3, "bar" 1, "quux" 1} 

So klingt es wie alles, was Sie wirklich tun müssen, tokenize der Eingabedatei ist und gelten frequencies in die Liste der Token.

Verwandte Themen