2015-09-08 76 views
3

我有一個案例,我需要檢查列表中的所有字符串元素是否相等,並且我試圖弄清楚最常用的解決方案是什麼樣子。我目前的做法是,在map應用到列表中,檢查是否每一個元素等於先減少與「=」結果布爾列表:驗證列表中的所有元素是否相等

(def string-list '("3" "3" "3" "3" "3" "3")) 
(reduce = (map #(.equals (first string-list) %) string-list)) 

很顯然,這不是一個很好的解決方案。是否有更多的「clojure風格」解決方案,或者甚至是我還沒有看到的更簡單的方法?

+0

爲什麼不只是轉換設置,檢查大小爲1? – mavarazy

+1

這會起作用,但我不確定此代碼的意圖是否會讓其他開發人員一見鍾情。 – javahippie

+0

請注意,'reduce ='不僅僅是一個非常好的解決方案,它不是一個解決方案。試試'(1 2 2)'。 – amalloy

回答

11

您可以使用以下方法:

(apply = string-list) 
+0

這正是我所尋找的,非常感謝! – javahippie

+0

值得一提的是,這將炸燬一個空列表的秩序異常,因此您可能需要首先進行非空洞檢查以確保安全。 – johncowie

3

正如@Symfrog回答,使用apply=看起來最好。

(apply = string-list) 

也許它看起來可能使用distinct功能或set,然而,這些都不是一個好主意,因爲這些不爲無限序列工作,雖然正確答案將很快恢復。

;; works for small sequence, however, will not work for infinite sequence like (range) 
(= 1 (count (distinct string-list))) ; bad idea 
(= 1 (count (into #{} string-list))) ; bad idea 
+0

'(= 1(count(distinct string-list)))'是一個不好的解決方案:即使正確的答案可能很快被認爲是'false',它從不會返回'(range)'。 – amalloy

+0

@amalloy感謝您的評論。我雖然沒有。 – ntalbs

相關問題