【问题标题】:how to retrieve a key in a map whose value contains a particular substring in clojure?如何检索映射中的键,其值包含clojure中的特定子字符串?
【发布时间】:2018-09-09 12:26:14
【问题描述】:

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

:CAB "NAB/TRY/FIGHT.jar"

所以在这种情况下,输出应该是 :CAB

我是 Clojure 的新手,我尝试了一些诸如 .contains 之类的东西,但我无法为上述问题形成确切的功能。在其他几种语言(如 python)中更容易,但我不知道如何在Clojure。

有没有办法检索密钥的名称?

【问题讨论】:

  • 你的意思是:keyvalue包含子串“try”吗?
  • 是的,我就是这个意思

标签: string dictionary clojure


【解决方案1】:

for 也可以使用:when 进行过滤。例如

(for [[k v] {:FOO "TRY" :BAR "BAZ"} 
      :when (.contains v "TRY")] 
        k)

【讨论】:

    【解决方案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)
    

    【讨论】:

      【解决方案3】:

      最简单的方法是使用 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))
      

      【讨论】:

      • (filter some? (map f xs)) === (keep f xs)
      • @amalloy 不错!今天我学到了一些东西:)。 TBH 我更喜欢@Axnyff 的解决方案而不是(some filter-fn coll),但我太固执了,无法删除我的答案:P
      【解决方案4】:

      您可以在您的集合中使用一些,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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        • 2016-04-23
        • 1970-01-01
        • 2012-10-27
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多