2016-04-20 3 views
1

Если я простой вариант (+ (count [1 2 3 4]) (count [1 2 3 4])) я получить правильный ответ 8Как добавить несколько счетчиков больших списков

Но когда я использую большую версию масштаба из моей программы, которые потенциально могут иметь count сравнявшись 100000 это не более длинные функции. 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 не работают в этом случае, или другим способом суммировать общее количество элементов в обоих списках.

ответ

3

В вашем коде вы читаете от того же читателя в двух местах. Кажется, что первая строка потребляет весь читатель, а второй не получает линий для фильтрации. Обратите внимание, что каждый вызов .readLine перемещает позицию во входном файле.

Я предполагаю, что вы хотели сделать что-то вроде:

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

Использование with-open будет убедиться, что ваш дескриптор файла будет закрыт, а ресурсы не будет течь. Я также объединил ваши два отдельных регулярных выражения в один.

+0

Хорошо, поэтому я начинаю с пустого файла к тому времени, когда я доберусь до поиска промахов. Я должен был предположить, что из чтения файла java/C спасибо. – Kebtiz

Смежные вопросы