2015-08-17 32 views
0

任何方式我都可以通过以下代码获得更多的惯用Clojure。我知道我错过了关于解构的一些东西。至少我可以说我理解当前的代码。我的第一个诱惑是使用doseq,然后填充hash-map,但我确信map是解决方案。改善此Clojure代码以获得更多习惯用法

的代码读取一个CSV文件 - 由最高得分排序

Name,Department,Score 
Rohan,IT,8 
Bob,Sales,6 
Tom,IT,9 
Jane,Accounting,3 
Mary,Sales,9 
Harry,IT,8 
Frodo,Marketing,8 
Bilbo,Accounting,10 

和将输出行。简单!

(def file "scores.csv") 

(defn list-of-vecs [] 
    (let [file-str (slurp file)] 
    (let [lines (clojure.string/split-lines file-str)] 
     (next (map #(clojure.string/split % #",") lines))))) 

(defn list-of-maps [] 
    (map (fn [n] {:name (n 0), :department (n 1), :score (Integer/parseInt (n 2))}) 
     (list-of-vecs))) 

(defn sorted-list [] 
    (reverse (sort-by :score (list-of-maps)))) 

(defn print-high-scores [] 
    (prn "Name","Department","Score") 
    (map (fn [m] (prn (m :name) (m :department) (m :score))) (sorted-list))) 

任何反馈将不胜感激,包括在缩进。

另外我很惊讶的表现(跑在里面)。的8行25K线

parse-csv.core=> (time print-high-scores) 
"Elapsed time: 0.026059 msecs" 

CSV文件

CSV文件

parse-csv.core=> (time print-high-scores) 
"Elapsed time: 0.025636 msecs" 
+0

还是我使用'time'不正确? –

+2

更实际可靠的方法是使用CSV解析库。如果(引号)的值变成逗号,盲目地用逗号分割将会失败。你的情况是否可行?我认为这个问题更多地属于CodeReview.SE。你并没有真正解决问题,你正在寻找改进代码的方法。 –

+1

Clojure有一个官方的CSV阅读器:https://github.com/clojure/data.csv然后做1:用一个简单的'map'解析整数。 2:'排序' – ClojureMostly

回答

1

做你的(time print-high-scores)实际打印什么?

Or am I using time incorrectly

我认为你是正确的期运用,但测量错误的事情。

我的方法:

; read file - drop header line 
(def input 
    (rest (line-seq (clojure.java.io/reader "inputfilename")))) 

; top ten 
(def top-ten 
    (take 10 (time (sort-by 
       #(- (Integer/parseInt (nth % 2))) ; negate so highest first 
       (map (fn [line] 
        (clojure.string/split line #",")) input))))) 
; 10 lines "Elapsed time: 0.469539 msecs" 
; 25k lines "Elapsed time: 68.157863 msecs" 

; print - sideeffect 
(time (doseq [e (doall top-ten)] 
    (print e "\n"))) 

"Elapsed time: 0.02804 msecs" 
[Bilbo Accounting 10] 
[Tom IT 9] 
[Mary Sales 9] 
[Rohan IT 8] 
[Harry IT 8] 
[Frodo Marketing 8] 
[Bob Sales 6] 
[Jane Accounting 3] 
nil