Clojure,计算地图中的单词

时间:2014-12-24 12:37:08

标签: clojure

我对Clojure比较陌生,所以我可能要问的可能是完全错误的。基本上我想创建一个名为wordCount的函数,它计算从另一个方法传入的单词。我的代码结构如下;

( defn  createWordMap [x]   
  (cond
   (= (mod x 3) 0) "divisible by 3"
 :else (print-str x))
)

( defn  wordCount [x]   
  ;; I want to count the words in the map created and passed in
)

( wordCount ( map createWordMap ( range 100 ) ) )

2 个答案:

答案 0 :(得分:3)

我把它分成了几个部分。我建议你在每个部分的末尾停止阅读,看看你能得到多少。


您的createWordMap功能看起来不对。

  • 如果条件为真,则返回一个字符串。
  • 如果条件为false,则打印字符串并返回nil

此处无需使用condif也会这样做。


将数字作为字符串的函数可以是

(defn words [x]
  (if (= (mod x 3) 0)
    "divisible by 3"
    (str x)))

它没有创建地图,所以我们只需将其称为words


现在我们需要一些东西来计算字符串中的单词。正如the other solution所做的那样,我们计算空格并加1.它用正则表达式更快更普遍地做到这一点,但我们现在暂时搁置它。


(defn count-words [s]
  (->> s
     (filter #{\space})
     count
     inc))
  • ->>宏线程连续的函数调用。
  • 集合#{\space}作为一个只返回true的函数运行 一个空间。

现在我们需要

  • 099的数字映射到其字符串
  • 计算每个中的单词,
  • 并将它们加在一起。

如果您不想看到答案,请继续阅读。


(apply + (map (comp count-words words) (range 100)))
;168

使用正则表达式

如果我们想要了解这些词 - 不只是计算它们,我们可以使用re-seq

(re-seq #"\w+" "mary had a little lamb")
;("mary" "had" "a" "little" "lamb")

它接受任何序列的空格字符作为单词分隔符。

然后答案可以表达

(apply + (map (comp count #(re-seq #"\w+" %) words) (range 100)))

答案 1 :(得分:0)

天真的解决方案

(defn wordCount [x] (reduce + (map #(inc (count (filter (partial = \space) %))) x)))

假设默认情况下修剪了

(reduce + some-list-of-numbers) ;; sums a list of number

#(int (count (filter (partial = \space) %)))

是一个计算空格数并添加1的函数。

这就是全部。