簡體   English   中英

遞歸跟蹤哈希映射 clojure 中的值

[英]recursively following values in a hash map clojure

我在為以下遞歸函數提供邊緣情況時遇到問題,該函數搜索哈希映射和其他類似的鍵值存儲。

(def hashbrownies
  {"Mary","Dave"
   "Dave","Anne"
   "Anne","Tim"})

目前的方法

(defn recursive-lookup
  [key-lst search-func conditional]
  (let [next-key (search-func (first key-lst))]
    (if (conditional next-key)
      (reverse key-lst)
      (recur (cons next-key key-lst) search-func conditional))))

有效的例子

>> (recursive-lookup ["Mary"] #(hashbrownies %) (partial = nil))
=> ("Mary" "Dave" "Anne" "Tim")

>> (recursive-lookup ["Mary"] #(hashbrownies %) #(< (.length %) 4))
=> ("Mary" "Dave" "Anne")

有問題:

>> (recursive-lookup ["Mary"] #(hashbrownies %) #(> (.length %) 4))
=> NullPointerException   clojure.lang.Reflector.invokeNoArgInstanceMember (Reflector.java:296)

我可以看到問題是什么:由於無法滿足條件,函數#(> (.length %) 4)nil (最后一個可能的返回值)作為參數。 但是作為 Clojure 的新手,我不確定如何解決這個問題。 有沒有慣用的方法?

解決方案:

(defn recursive-lookup
  [key-lst search-func conditional]
  (let [next-key (search-func (first key-lst))]
    (if (or (nil? next-key)
            (conditional next-key))
      (reverse key-lst)
      (recur (cons next-key key-lst) search-func conditional))))

您需要在條件函數中處理nil 你可以使用fnil fnil用一些默認值替換 nil。 所以你可以試試:

(fnil #(> (.length %) 4) "")

如果此條件函數收到nil它將用空字符串 "" 替換nil ,然后調用您的函數#(> (.length %) 4)

您也可以使用count代替.length Count 為 nil 返回 0:

(count "123") => 3
(count nil) => 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM