Clojure 如何添加大型列表的多个计数

Clojure 如何添加大型列表的多个计数,clojure,Clojure,如果我做一个简单的版本 (+(计数[1234])(计数[1234])) 我得到了正确的答案8 但是,当我使用程序中的大规模版本时,它可能会使count等于100000,但它不再起作用。combatLog是一个100000行日志文件 (let [rdr (BufferedReader. (FileReader. combatLog))] (+ (count (filter (comp not nil?) (take 100000 (repeatedly #(re-seq #

如果我做一个简单的版本
(+(计数[1234])(计数[1234]))
我得到了正确的答案
8

但是,当我使用程序中的大规模版本时,它可能会使
count
等于100000,但它不再起作用。combatLog是一个100000行日志文件

   (let [rdr (BufferedReader. (FileReader. combatLog))]
        (+  (count (filter (comp not nil?) (take 100000 (repeatedly #(re-seq #"Kebtiz hits" (str (.readLine rdr)))))))
            (count (filter (comp not nil?) (take 100000 (repeatedly #(re-seq #"Kebtiz misses" (str (.readLine rdr)))))))
            )
        )

在这种情况下,它只返回第一个计数的值。我试图找出在这种情况下
+
count
不起作用的原因,或者用另一种方法计算两个列表中的元素总数。

在代码中,您是从两个位置的同一个读卡器读取的。似乎第一行占用了整个读卡器,而第二行没有要过滤的行。请注意,每次调用
.readLine
都会移动输入文件中的位置

我猜你想做一些事情,比如:

(with-open [reader (clojure.java.io/reader combatLog]
  (->> reader
    (line-seq)
    (filter #(re-seq #"Kebtiz hits|Kebtiz misses"))
    (count)))

与open一起使用
将确保您的文件句柄将被关闭,并且资源不会泄漏。我还将两个单独的正则表达式合并为一个。

好的,在搜索未命中时,我将从一个空文件开始。我应该从java/C文件阅读中假设,谢谢。