Clojure 比较两个字符串并返回匹配的字数
一般来说,我对Clojure和编程都相当陌生。 有没有一种方法可以逐字比较两个字符串,然后返回两个字符串中匹配的单词数?还有,如何计算字符串中的数字 例: 比较string1“Hello Alan and Max”和string2“Hello Alan and Bob”将返回“3”(例如Hello Alan和两个字符串中的单词是否匹配) 在string1中查找字数将得到数字4Clojure 比较两个字符串并返回匹配的字数,clojure,Clojure,一般来说,我对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?”的问题在这里因为过于宽泛而被关闭,除非您展示了您自己如何尝试实现该规范的具体问题。也就是说,在这个被回答而不是被关闭的过程中,你是幸运的