我有一个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
我无法为每一个结果找到路径,只有第一个逻辑真理。我尝试了map
和keep
,但他们打破了递归。我怎样才能让这段代码回溯所有结果的路径,而不仅仅是第一个?任何帮助表示赞赏。
答案 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 + " ";
}
}
。