我需要检索其值包含字符串“ TRY”的键
:CAB "NAB/TRY/FIGHT.jar"
因此,在这种情况下,输出应为:CAB 。
我是Clojure的新手,我尝试了一些诸如.contains等的事情,但是我无法形成上述问题的确切函数。在python等其他几种语言中,它更容易实现,但我不知道该怎么做Clojure。
是否可以检索密钥名称?
答案 0 :(得分:2)
for
也可以使用:when
进行过滤。例如
(for [[k v] {:FOO "TRY" :BAR "BAZ"}
:when (.contains v "TRY")]
k)
答案 1 :(得分:2)
首先,不建议使用.contains
-首先,您无需使用基础语言(Java或JavaScript)的内部结构,其次,由于无法确定Clojure是否可以确保使用该语言,因此会强制进行反射参数是一个字符串。
最好改用clojure.string/includes?
。
这里已经提出了几种可行的解决方案,用于根据值提取密钥,这里还有一个使用keep
函数的密钥:
(require '[clojure.string :as cs])
(keep (fn [[k v]] (when (cs/includes? v "TRY") k))
{:CAB "NAB/TRY/FIGHT.jar" :BLAH "NOWAY.jar"}) ; => (:CAB)
答案 2 :(得分:0)
最简单的方法是使用java.lang.String中的contains方法。我会用它来映射有效键,然后过滤以删除所有nil值:
(filter some?
(map (fn [[k v]] (when (.contains v "TRY") k))
{:CAB "NAB/TRY/FIGHT.jar" :BLAH "NOWAY.jar"}))
=> (:CAB)
如果您认为地图中最多有一个这样的匹配k / v对,则只需在其上调用first
即可获取相关密钥。
例如,您还可以使用正则表达式代替.contains
(fn [[k v]] (when (re-find #"TRY" v) k))
答案 3 :(得分:0)
您可以在集合上使用某些变量,some
将在映射中的每个值中操作给定函数,直到该函数返回非nil值为止。
我们将使用该功能
(fn [[key value]] (when (.contains values "TRY") key))
when
会返回nil
,除非条件匹配,否则它将完全适合我们的用例。我们在函数的参数中使用分解来获取键和值。当被某些人使用时,您的收藏集确实会转换为看起来像
'((:BAR "NAB/TRY/FIGHT.jar"))
如果您的地图名为coll,则以下代码可以解决问题
(some
(fn [[key value]] (when (.contains value "TRY") key))
coll)