嵌套地图和矢量

时间:2016-11-19 17:00:07

标签: clojure clojurescript edn

我有一个edn,其中我有嵌套的地图。我找到了一个非常好的例子Clojure: a function that search for a val in a nested hashmap and returns the sequence of keys in which the val is contained

(def coll
  {:a "aa"
   :b {:d "dd"
       :e {:f {:h "hh"
               :i "ii"}
           :g "hh"}}
   :c "cc"})

有了这个答案

(defn find-in [coll x]
    (some
(fn [[k v]]
  (cond (= v x) [k]
        (map? v) (if-let [r (find-in v x)]
                   (into [k] r))))
coll))

我的问题是因为some我无法为每一个结果找到路径,只有第一个逻辑真理。我尝试了mapkeep,但他们打破了递归。我怎样才能让这段代码回溯所有结果的路径,而不仅仅是第一个?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您可以使用辅助函数将嵌套地图转换为具有完全限定键的平面地图。然后,find-in可以只过滤值并返回匹配的键。

(defn flatten-map [path m]
  (if (map? m)
    (mapcat (fn [[k v]] (flatten-map (conj path k) v)) m)
    [[path m]]))

(defn find-in [coll x]
  (->> (flatten-map [] coll)
       (filter (fn [[_ v]] (= v x)))
       (map first)))

使用您的样本:

(find-in coll "hh")
=>
([:b :e :f :h] [:b :e :g])

答案 1 :(得分:0)

filter会提供所有结果,其中some只会向您提供第一个结果,如果没有nil,则会some。通常可以通过过滤然后采用第一个问题来解决相同的问题,而不是使用//Print first 100 Prime numbers. for (i = 1; i <= 100; i++) { int counter=0; for(num =i; num>=1; num--) { if(i % num == 0) { counter = counter + 1; } } if (counter == 2) { //Display the output of 5 numbers per row. System.out.print(" " + i); if(i % 5 == 1) { System.out.print("\n"); } //Prime number is assigned to the empty string class variable. displayPrimes = displayPrimes + i + " "; } }