【问题标题】:Clojure printing list twice when I only call print once当我只调用一次打印时,Clojure 打印列表两次
【发布时间】:2016-11-14 18:39:04
【问题描述】:

因此,在 Java 开发人员职位的面试中,我被要求设计一种算法,以从 100 万个值的数组中找到 10 个最大值。我想出了一个简单的蛮力算法,让我的面试官非常满意。我明天去参加第二轮面试。

因为我喜欢挑战自己,所以我一直在阅读“Clojure for the Brave and True”,并在采访后不久进入关于惰性序列和集合的部分,并开始怀疑我是否无法实现 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)

它会产生预期的输出 TWICE:

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

根据我是使用 print 还是 println,输出会略有变化,如果我使用 println,第二组输出将从新行开始。

我相当确定第一个输出是我调用函数和处理结果的方式的产物,但我不确定我哪里出错了!

【问题讨论】:

  • 你是如何执行这个脚本的?只需复制粘贴此脚本,运行它,我只看到输出的单个版本,而不是双重版本。事实上,我使用lein exec 来运行它:cat yourscript.clj | lein exec
  • 我是通过单击 IntelliJ 中的运行按钮/命令来运行它的......我会试试你的方法。
  • @AlexMiller 在下面评论说,删除 (-main) 行将解决 IntelliJ 中的问题,并且确实如此。 @MatiasElgart 建议使用 lien exec 也有效。

标签: clojure


【解决方案1】:

底部的-main 在你加载命名空间时执行。然后你在它上面调用-main,再次运行它。所以,只要去掉最后的 (-main) 就可以了。

【讨论】:

  • Alex Miller - 感谢您的解释!那行得通。
猜你喜欢
  • 2019-03-31
  • 1970-01-01
  • 2018-07-19
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多