clojure:删除不区分大小写的字符串重复项

mik*_*kom 2 string clojure matching

如果存在不区分大小写的匹配,从字符串数组中删除字符串的惯用 clojure 方法是什么?

我需要保留结果的大小写(我总是想保留不敏感匹配的第一次出现)。

简单的例子:

(distinct-case-insensitive ["fish" "Dog" "cat"] ["FISH "DOG"])
Run Code Online (Sandbox Code Playgroud)

会回来

["fish" "Dog" "cat"]
Run Code Online (Sandbox Code Playgroud)

mis*_*off 5

这是我想出的解决方案。为了简化功能,它只接受一个带有重复项的列表,因此如果您(apply concat lists)之前需要可变参数列表。

(defn distinct-case-insensitive [xs]
  (->> xs
       (group-by clojure.string/lower-case)
       (vals)
       (map first)))

(distinct-case-insensitive ["fish" "Dog" "cat" "Fish" "DOG"]) => 
("fish" "Dog" "cat")
Run Code Online (Sandbox Code Playgroud)

但是,正如列昂尼德提到的那样,由于哈希图,它不会保留顺序。对于订购的解决方案使用

(defn distinct-case-insesitive [xs]
    (->> xs
         (group-by clojure.string/lower-case)
         (#(map % (map clojure.string/lower-case xs)))
         (map first)
         (distinct)))
Run Code Online (Sandbox Code Playgroud)

  • @mishadoff 出于好奇,我运行了一些基准测试。两种解决方案都具有线性复杂度,但“reduce”解决方案的运行速度几乎快了 2 倍。但无论如何我更喜欢你的解决方案,因为它清晰而简单。 (2认同)