2017-11-19 17 views
0

나는 최종 시험을 준비하기 위해 clojure를 처음 접하고 일부 시험 문제를 연습하기가 쉽습니다.클로저에있는 맵에서 문자열의 빈도를 계산하십시오.

모든 이름의 빈도를 파일에서 찾으려고합니다. 파일을 한 줄씩 읽었을 때 특정 키워드가지도에 포함되어 있으면 각 문자열을 저장합니다. 반복을 원하지 않기 때문에, 나는 그것 앞에서 뚜렷하게 설명하려고 노력하고있다. 그러나 나는 여전히 반복되는 요소들을 계속 간직하고있다.

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

여기 내 샘플 출력 : 내가이 철인 요소를 제거하고자합니다.

(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의 경우가 여기에 당신이 필요로하는 간단한 함수가 이미 존재 : 당신이 정말로 할 필요가 입력 파일 토큰 화이며, 토큰의 목록에 frequencies을 적용 같은

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

그래서 소리가 난다.