2014-10-01 86 views
1

我正在處理這兩組鍵值對,它們被另一個函數返回。我想寫一個函數,它總能找到最高的鍵並返回相應的值。在這個例子中,我會返回2,因爲499是最高的關鍵。我正在處理的數據是Clojure中最高鍵值的返回值

({-99 0, 99 0} {-99 2, 499 2}) 

當我打電話

(type ({-99 0, 99 0} {-99 2, 499 2})) 

內,負責其返回該數據的功能,我回來

(clojure.lang.PersistentTreeMap clojure.lang.PersistentTreeMap) 

我希望幫助。謝謝!

+1

顯然你的意思'(圖型對)' – 2014-10-01 17:17:27

+0

怎麼辦你想解決重複的最大密鑰? – Jeremy 2014-10-01 22:32:28

回答

-2

({-99 0, 99 0} {-99 2, 499 2})是查找操作,其中{-99 0, 99 0}是字典而{-99 2, 499 2}是關鍵。由於後者不是前者的關鍵,表達式將返回零。

當我評估(type ({-99 0, 99 0} {-99 2, 499 2}))時,我得到nil,因爲nil的類型也是nil

+3

這不是一個操作,它是一個列表,「由另一個函數返回」。 – 2014-10-01 17:16:44

1
(as-> (apply merge pair) 
     merged 
     (->> merged 
      keys 
      (apply max) 
      merged)) 

請注意,當兩個圖都具有「最高」鍵時,將返回第二個值。

0

這是一個很好的用例max-key,我認爲有一種誤導的名字(其使用的一個很好的例子見this other SO question) - 它實際上做的是它需要一個功能的集合,它返回集合中具有將該函數應用於該項目的最高結果的項目。您可以使用函數key,該函數返回鍵值對的鍵。

(請注意,您需要一起Concat的您的地圖讓你與鍵值對的單一收集。)

(apply max-key key (concat {-99 0, 99 0} {-99 2, 499 2})) 
;=> [499 2] 

(second *1) 
;=> 2 
+0

我會注意到,如果有重複鍵,最右邊的值將被選中。 '(apply max-key key(concat {-99 0,499 0} {-99 2,499 2})); => [499 2]' – Jeremy 2014-10-01 22:38:11

+1

你是對的......這會導致問題,如果最右邊關鍵不是價值最高的那個。有趣的是,'(concat {-99 0,499 5} {-99 2,499 2})'自己返回一個* *包含重複鍵的列表:'([-99 0] [499 5] [ - 99 2] [499 2])'。但是,通過執行'(apply max-key key ...)'似乎將這些鍵強制轉換爲java.util.Map $ Entry'鍵值對,並通過使用最右邊的鍵來消除重複項,不正確的(注意我改變了最左邊一個的值> 2)'[499 2]'的答案。 – 2014-10-02 17:41:51

+0

實際上,在進一步的回顧中,'[499 2]'在技術上沒有錯誤--OP只是尋找一種方式返回最高* key *的值,即499.那麼問題是該鍵有兩個值,無論如何,我仍然認爲'max-key'是一個很好的解決方案,假設你'這是一個沒有重複鍵的地圖 – 2014-10-02 17:46:16

-1
(defn val-for-max-key [maps] 
    (->> (map (partial apply max-key key) maps) 
     (apply max-key key) 
     val)) 

編輯: 誤解所需的返回值

+0

'(val-for-max-key'({-99 0,99 5000} {-99 2,499 2})); => 5000' – Jeremy 2014-10-01 22:31:05

3

此函數將返回對數時間

01中Clojure排序映射(內置實現稱爲 clojure.lang.PersistentTreeMap)的最右項
(defn rightmost 
    "Takes a Clojure sorted map sm and returns the entry at the greatest 
    key (as determined by sm's comparator)." 
    [sm] 
    (first (rseq sm))) 

例子:

(rightmost (sorted-map 1 1 2 2 3 3)) 
;= [3 3] 

然後,您可以撈出用val函數的值。

所有max-key/apply max爲基礎的解決方案線性時間,而不是工作。不用說,這是一個巨大的差異。

如果其他功能可以被說服重返data.avl映射相反,你可以使用nth在對數時間任何索引訪問元素:

;; works for data.avl sorted maps, not the built-ins 
(nth (avl/sorted-map 1 1 2 2 3 3) 2) 
;= [3 3]