2014-10-02 35 views
0

這是一個錯誤,或者我可以修復它嗎? (當然,在我的生活代碼的相似數量計算)Clojure NullPointerException與排序

(sort-by :similarity > (for [ob [:a :b :c]] [:object ob :similarity 0.0])) 
NullPointerException clojure.lang.Numbers.ops (Numbers.java:961) 

使用Clojure的1.6.0,Fedora的20x64,標準REPL。

ADDED 爲什麼我得到的是失敗,但(我認爲那些是相似的)這個我沒事:

user=> (sort-by :similarity > [{:shape "circle" :similarity 1.0}{:shape "square" :similarity 0.5}{:shape "triangle" :similarity 0.0}]) 
({:similarity 1.0, :shape "circle"} {:similarity 0.5, :shape "square"} {:similarity 0.0, :shape "triangle"}) 
+0

一個優點是,當你遇到這樣的問題,很容易評估子表達式。 – user100464 2014-10-02 14:33:11

回答

3

您無法通過關鍵字訪問向量元素,只通過他們的指數:

=> (get [:similarity 0.5] :similarity) 
nil 
=> (get [:similarity 0.5] 1) 
0.5 

所以,你應該使用HashMap的:

=> (get {:similarity 0.5} :similarity) 
0.5 

這裏是你的代碼應該是什麼樣子:

(sort-by :similarity > (for [ob [:a :b :c]] {:object ob :similarity 0.0})) 
+0

請原諒我是Clojure的新成員,但如果我不能做矢量+鍵,爲什麼會這樣工作:(添加到主要問題) – WorldsEndless 2014-10-02 14:37:24

+0

@WorldsEndless嘗試運行'(for [ob [:a:b:c]] [ :object ob:similarity 0.0])'在REPL中,你會發現它不同。 – 2014-10-02 14:44:39

+0

然後將它與我的版本'(for [ob [:a:b:c]] {:object ob:similarity 0.0})'進行比較。 – 2014-10-02 14:46:52

0

我覺得這是你的問題:

使用REPL的
=> (map :similarity (for [ob [:a :b :c]] [:object ob :similarity 0.0])) 
(nil nil nil) 
=> (for [ob [:a :b :c]] [:object ob :similarity 0.0]) 
([:object :a :similarity 0.0] [:object :b :similarity 0.0] [:object :c :similarity 0.0])