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

时间:2016-04-20 19:45:21

标签: clojure

如果我做一个简单的版本     (+ (count [1 2 3 4]) (count [1 2 3 4])) 我得到了正确答案8

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

   (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在这种情况下不起作用,或者另外一种方法来对两个列表中的元素总数求和。

1 个答案:

答案 0 :(得分:3)

在您的代码中,您在两个地方阅读同一个阅读器。似乎第一行消耗整个阅读器而第二行没有行过滤。请注意,每次调用(with-open [reader (clojure.java.io/reader combatLog] (->> reader (line-seq) (filter #(re-seq #"Kebtiz hits|Kebtiz misses")) (count))) 都会移动输入文件中的位置。

我猜你想做点什么:

with-open

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