Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 比较两个字符串并返回匹配的字数_Clojure - Fatal编程技术网

Clojure 比较两个字符串并返回匹配的字数

Clojure 比较两个字符串并返回匹配的字数,clojure,Clojure,一般来说,我对Clojure和编程都相当陌生。 有没有一种方法可以逐字比较两个字符串,然后返回两个字符串中匹配的单词数?还有,如何计算字符串中的数字 例: 比较string1“Hello Alan and Max”和string2“Hello Alan and Bob”将返回“3”(例如Hello Alan和两个字符串中的单词是否匹配) 在string1中查找字数将得到数字4 谢谢让我们把它分解成一些小问题: 逐字比较两个字符串 首先,我们需要一种获取字符串并返回其单词的方法。一种方法是假设任何

一般来说,我对Clojure和编程都相当陌生。 有没有一种方法可以逐字比较两个字符串,然后返回两个字符串中匹配的单词数?还有,如何计算字符串中的数字

例: 比较string1“Hello Alan and Max”和string2“Hello Alan and Bob”将返回“3”(例如Hello Alan和两个字符串中的单词是否匹配) 在string1中查找字数将得到数字4


谢谢

让我们把它分解成一些小问题:

逐字比较两个字符串

首先,我们需要一种获取字符串并返回其单词的方法。一种方法是假设任何空格都是分隔单词的,因此我们可以使用正则表达式:

返回两个字符串中匹配的字数

我能想象的最简单的方法是构建两个,一个表示两个句子中的单词集,并找到两个集合的交点:

(set (string->words "a b c a b c d e f"))
=> #{"d" "f" "e" "a" "b" "c"} ;; #{} represents a set
(defn common-words [a b]
  (let [a (set (string->words a))
        b (set (string->words b))]
    (clojure.set/intersection a b)))

(common-words "say you" "say me")
=> #{"say"}
我们可以使用
clojure.set/intersection
函数查找两个集合的交集:

(set (string->words "a b c a b c d e f"))
=> #{"d" "f" "e" "a" "b" "c"} ;; #{} represents a set
(defn common-words [a b]
  (let [a (set (string->words a))
        b (set (string->words b))]
    (clojure.set/intersection a b)))

(common-words "say you" "say me")
=> #{"say"}
要获得(匹配)单词的计数,我们可以使用
count
函数和上述函数的输出:

(count (common-words "say you" "say me")) ;; => 1

你需要做的是两两比较单词序列中的项目,并计算项目的数量,直到第一次不匹配为止。以下是这篇文章的逐字翻译:

(defn mismatch-idx [s1 s2]
  (let [w #"\S+"]
    (->> (map = (re-seq w s1) (re-seq w s2))
         (take-while true?)
         count)))

user> (mismatch-idx "a b c" "qq b c")
;;=> 0
user> (mismatch-idx "a b c" "a x c")
;;=> 1
user> (mismatch-idx "a b c" "a b x")
;;=> 2

谢谢你,这很有帮助。请回答另一个问题,如何在变量中存储“匹配单词数”?一般来说,如何在变量中存储算术运算?但是
(常用词“me say”“say you”)
将输出
1
,而正确答案是0(考虑到第一个不匹配的单词索引,顺序)。@twistyfool 2将名称绑定到
let
块中的值。在上面的解决方案中,
a
b
都绑定到将每个字符串分解为单词的集合,然后在
let
块内,使用这些值计算交点。您可以创建自己的函数并使用自己的
let
块。另请参见:请注意,通常“如何实现规范X?”的问题在这里因为过于宽泛而被关闭,除非您展示了您自己如何尝试实现该规范的具体问题。也就是说,在这个被回答而不是被关闭的过程中,你是幸运的