如何在映射中检索其值包含clojure中的特定子字符串的键?

时间:2018-09-09 12:26:15

标签: string dictionary clojure

我需要检索其值包含字符串“ TRY”的键

:CAB "NAB/TRY/FIGHT.jar"

因此,在这种情况下,输出应为:CAB

我是Clojure的新手,我尝试了一些诸如.contains等的事情,但是我无法形成上述问题的确切函数。在python等其他几种语言中,它更容易实现,但我不知道该怎么做Clojure。

是否可以检索密钥名称?

4 个答案:

答案 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,除非条件匹配,否则它将完全适合我们的用例。我们在函数的参数中使用分解来获取键和值。当被某些人使用时,您的收藏集确实会转换为看起来像

的coll
'((:BAR "NAB/TRY/FIGHT.jar"))

如果您的地图名为coll,则以下代码可以解决问题

(some
  (fn [[key value]] (when (.contains value "TRY") key)) 
  coll)