Clojure打印列表两次,当我只打一次打印

问题描述:

因此,在一个Java Dev职位的求职面试中,我被要求设计一个算法来从一百万个数值中找出十个最大值。我想出了一个简单的蛮力算法,这比我的面试官满意得多。我明天去参加第二轮面试。Clojure打印列表两次,当我只打一次打印

因为我喜欢挑战自己,我一直在阅读“勇敢和真实的Clojure”,在面试后不久就访问了Lazy Sequences和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,在第二盘开始输出一个新的行,如果我使用println。

我相当确信第一个输出是我调用函数和处理结果的方式的工件,但我不确定我出错的地方!

+1

你是怎么执行这个脚本的?只是复制粘贴这个脚本,运行它,我只看到一个版本的输出,而不是双倍。实际上,我使用[lein exec](https://github.com/kumarshantanu/lein-exec)像这样运行它:'cat yourscript.clj | lein exec' –

+0

我是通过点击IntelliJ中的运行按钮/命令来运行它....我会试试你的方法。 – cptully

+1

@AlexMiller在下面评论说,删除(-main)行将解决IntelliJ中的问题,并且确实如此。 @ MatiasElgart建议使用'lien exec'也可以。 – cptully

底部的-main在您加载名称空间时执行。然后你调用-main,再次运行它。所以,只要摆脱最后的(-main),你应该完成。

+0

亚历克斯米勒 - 感谢您的解释!这工作。 – cptully