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。
我相当确信第一个输出是我调用函数和处理结果的方式的工件,但我不确定我出错的地方!
你是怎么执行这个脚本的?只是复制粘贴这个脚本,运行它,我只看到一个版本的输出,而不是双倍。实际上,我使用[lein exec](https://github.com/kumarshantanu/lein-exec)像这样运行它:'cat yourscript.clj | lein exec' –
我是通过点击IntelliJ中的运行按钮/命令来运行它....我会试试你的方法。 – cptully
@AlexMiller在下面评论说,删除(-main)行将解决IntelliJ中的问题,并且确实如此。 @ MatiasElgart建议使用'lien exec'也可以。 – cptully