2017-11-19 19 views
0

私はかなりクロージャーに慣れていて、いくつかの試験問題を練習して最終試験に備えるのです。地図内の文字列の頻度をクロージャーでカウントする

私はすべての名前の頻度をファイルに見つけることを試みています。ファイルを1行ずつ読み込み、地図に特定のキーワードが含まれている場合は各文字列を保存します。私は反復を望んでいないので、私はそれの前に別のものを置いてみようとしていますが、私はまだ繰り返し要素を得続けています。ここで

(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)) 
      ) 
     ) 
     ) 
    ) 
    ) 
) 
) 

は私のサンプル出力です: 私は2つのアイアンマンの要素を取り除きたいです。

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

紛失しているものはありますか?

+3

ここには何も書かれていませんが、ここで改善の余地があります:1. 'distinct'はコレクションをとります。 'map'関数を渡しているので、あなたが望むものが得られないのです。 2.これに対する最良の答えは、ネストされた 'if'ステートメントを含む可能性は低いです。あなたがテストしたい値をベクトルに入れておき、それをあなたの関数に対して繰り返してみてください。 3.あなたの機能をより小さなものに分割することを検討してください。 – jmargolisvt

答えて

2

Clojureでは、タスクを達成するために必要なものをできるだけ簡単な関数に分解することをお勧めします。これらの単純な関数を記述してテストすれば、それらを結合することができます。

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

あなたが本当にする必要があるすべての入力ファイルをトークン化し、トークンのリストにfrequenciesを適用しているようなので、それが聞こえる:ここfrequenciesの場合と同様にしばしば、あなたはすでに必要な簡単な関数は、存在しています。

関連する問題