2016-11-14 2 views
0

Итак, на собеседовании для позиции Java Dev мне было предложено разработать алгоритм, чтобы найти десять самых больших значений из массива в 1 миллион значений. Я придумал простой алгоритм грубой силы, который более чем удовлетворил моего интервьюера. Завтра я поеду на второй тур.Clojure print list дважды, когда я вызываю только один раз print

Поскольку я люблю бросать вызов себе, я читал «Clojure for the Brave and True» и попал в раздел о Lazy Sequences and Collections вскоре после интервью и начал задаваться вопросом, не могу ли я реализовать функцию Clojure, чтобы сделать та же задача.

Я правильно обработал функцию фильтрации, но не могу понять, что вижу, когда запускаю приложение. Вот мой код:

(defn random-numbers 
    ([] (random-numbers 0)) 
    ([n] (cons n (lazy-seq (random-numbers (rand 10000)))))) 

(def big-array (take 1000000 (random-numbers))) 

(defn top-ten [[big0 big1 big2 big3 big4 big5 big6 big7 big8 big9 :as acc] x] 
    (cond 
    (> x big0) [x big1 big2 big3 big4 big5 big6 big7 big8 big9] 
    (> x big1) [big0 x big2 big3 big4 big5 big6 big7 big8 big9] 
    (> x big2) [big0 big1 x big3 big4 big5 big6 big7 big8 big9] 
    (> x big3) [big0 big1 big2 x big4 big5 big6 big7 big8 big9] 
    (> x big4) [big0 big1 big2 big3 x big5 big6 big7 big8 big9] 
    (> x big5) [big0 big1 big2 big3 big4 x big6 big7 big8 big9] 
    (> x big6) [big0 big1 big2 big3 big4 big5 x big7 big8 big9] 
    (> x big7) [big0 big1 big2 big3 big4 big5 big6 x big8 big9] 
    (> x big8) [big0 big1 big2 big3 big4 big5 big6 big7 x big9] 
    (> x big9) [big0 big1 big2 big3 big4 big5 big6 big7 big8 x] 
    :else acc)) 

(defn top-ten-list [coll] 
    (reduce top-ten [0 0 0 0 0 0 0 0 0 0] coll)) 

(defn unlines [coll] 
    (clojure.string/join \newline coll)) 

(defn -main [] 
    (print (unlines (top-ten-list big-array)))) 

(-main) 

И это дает ожидаемый результат ДВАЖДЫ:

9999.978584142405 
9999.966008266641 
9999.954608202788 
9999.925928099525 
9999.779899149064 
9999.755392364965 
9999.75279348399 
9999.640257438374 
9999.615213138313 
9999.447171545269999.978584142405 
9999.966008266641 
9999.954608202788 
9999.925928099525 
9999.779899149064 
9999.755392364965 
9999.75279348399 
9999.640257438374 
9999.615213138313 
9999.44717154526 

изменения выходных незначительно отличаться в зависимости от того, используется ли я печатать или Println, в том, что второй начинает набор выхода на новый line, если я использую println.

Я уверен, что первый результат является артефактом того, как я вызываю функции и обрабатываю их результаты, но я не уверен, где я ошибся!

+1

как вы выполняете этот скрипт? просто скопируйте-n-вставьте этот скрипт, запустите его, и я вижу только одну версию вывода, а не double. Фактически, я использовал [lein exec] (https://github.com/kumarshantanu/lein-exec), чтобы запустить его следующим образом: 'cat yourscript.clj | lein exec' –

+0

Я запускал его, нажав кнопку запуска/команду в IntelliJ .... Я попробую вы метод. – cptully

+1

@AlexMiller прокомментировал ниже, что падение (-main) линии устранит проблему в IntelliJ, и это произошло. @ Предложение MatiasElgart использовать 'lien exec' также работает. – cptully

ответ

4

-main внизу выполняется при загрузке пространства имен. Затем вы вызываете -main, запуская его снова. Итак, просто избавитесь от финального (-main), и вам нужно сделать все.

+0

Алекс Миллер - Спасибо за объяснение! Это сработало. – cptully

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