删除第一个数组中与第二个数组中的元素匹配的所有子字符串

时间:2015-01-07 18:40:23

标签: arrays clojure

任务

删除匹配的 second-array 中每个字符串的 first-array 中的每个子字符串。

在Clojure中最好的方法是什么?

  

示例:

     

first-array: [“Adam”“Goolan”“傻”]

     

第二阵列: [“a”“oo”“ll”]

     

结果: [“Adm”“Gln”“siy”]

     

请注意,如果

,结果应该相同      

第二阵列: [“oo”“ll”“a”]

2 个答案:

答案 0 :(得分:2)

如果是匹配元素(即第一项中的第一项与第二项中的第一项匹配,依此类推):

> (defn the-quest [xs ys] 
    (map #(clojure.string/replace (first %1) (second %1) "") (map vector xs ys)))
#'sandbox1427/the-quest
> (the-quest ["Adam" "Goolan" "silly"] ["a" "oo" "ll"])
("Adm" "Glan" "siy")

见@ Lee的评论如下:

> (map #(clojure.string/replace %1 %2 "") ["Adam" "Goolan" "silly"] ["a" "oo" "ll"])
("Adm" "Glan" "siy")
>  

注意 - 上述http://www.tryclj.com/

的礼貌

任意对任何匹配:

user=> (defn repl-all [x ys] 
  #_=>    (reduce #(clojure.string/replace %1 %2 "") x ys))

user=> (defn the-quest [xs ys]
  #_=>    (map #(repl-all %1 ys) xs))

user=> (the-quest ["Adam" "Goolan" "silly"] ["a" "oo" "ll"])
("Adm" "Gln" "siy")

答案 1 :(得分:1)

问题的两个略有不同的表述,你的例子并不能说明你想要的内容:

  1. 进行一次传递,删除与任何第二个字符串匹配的输入字符串的任何子字符串。
  2. 按顺序删除每个字符串一次。这可以删除比选项1更多的字符,因为每次删除都可以创建新的子字符串,否则这些子字符串将不具备资格。
  3. 如果您想要的是第二种情况,那么似乎需要注意。如果是第一种情况,我建议像

    那样
    (import java.util.regex.Pattern)
    
    (defn the-quest [strs to-remove]
      (let[my-pattern (->> to-remove
                           (map #(Pattern/quote %))
                           (clojure.string/join "|")
                           re-pattern)]
        (map #(clojure.string/replace % my-pattern "") strs)))
    

    这里我只创建一个匹配任何to-remove字符串的正则表达式,并在正则表达式的实例上执行一个replace。如果您希望能够在to-removed中使用正则表达式控制字符,则必须引入Pattern/quote