如果你有一個邊界有效的函數來分析一系列值,那麼將它建模爲一個序列。如果序列終止,大概該函數會返回一個無效值。
功能
(defn ensequence [f! valid?]
(take-while valid? (repeatedly f!)))
...返回由側有效功能f!
產生的值的序列,終止每當valid?
測試失敗。
例如,
(ensequence #(rand-int 10) #(not= 5 %))
...返回隨機值序列中(range 10)
,第一5
前剛剛停止:
(6 9)
...例如(您milage 會各不相同)。
要顯示ensequence
作品在您的情況如何,我們使用的反函數,輪流順序進入返回其連續元素的函數,nil
後:
(defn oracle! [coll]
(let [s (atom coll)]
(fn [] (let [x (first @s)] (swap! s rest) x))))
例如,
(repeatedly 10 (oracle! (range 5)))
;(0 1 2 3 4 nil nil nil nil nil)
爲您的數據
(def data [{1 "mary", 2 "dean"} {23 "ava", 4 "scout"} {3 "bina", 16 "bob"}])
功能
(oracle! data)
...先後返回其元素,其次是nil
S:
(repeatedly 10 (oracle! data))
;({1 "mary", 2 "dean"} {23 "ava", 4 "scout"} {3 "bina", 16 "bob"}
nil nil nil nil nil nil nil)
我們可以利用這個ensequence
,但它產生,恢復原來的順序:
(ensequence (oracle! data) identity)
;({1 "mary", 2 "dean"} {23 "ava", 4 "scout"} {3 "bina", 16 "bob"})
由於nil
是虛假的,在這裏永遠不會有效,所以identity
是一個很好的有效性測試。
現在我們已經有了序列,我們可以隨心所欲地做任何事情。在你的情況下,我們只是
- 將地圖連接成一個大的map-entries序列;
- 找到最多條目
key
;和
- 取其
val
。
這樣:
(val (apply max-key key (reduce concat data)))
;"ava"
我們應該用代替相當於data
,但它並沒有任何區別。
你嘗試了什麼?請給我們一些代碼。 – 2014-10-01 22:12:58