如果我做一个简单的版本
(+ (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
在这种情况下不起作用,或者另外一种方法来对两个列表中的元素总数求和。
答案 0 :(得分:3)
在您的代码中,您在两个地方阅读同一个阅读器。似乎第一行消耗整个阅读器而第二行没有行过滤。请注意,每次调用(with-open [reader (clojure.java.io/reader combatLog]
(->> reader
(line-seq)
(filter #(re-seq #"Kebtiz hits|Kebtiz misses"))
(count)))
都会移动输入文件中的位置。
我猜你想做点什么:
with-open
使用{{1}}将确保您的文件句柄将被关闭,资源不会泄漏。我还将你的两个单独的正则表达式合并为一个。