【问题标题】:Generating substrings in clojure在 clojure 中生成子字符串
【发布时间】:2014-05-21 11:40:53
【问题描述】:

我正在尝试在 clojure 中生成给定字符串的所有可能的前缀子字符串。例如,如果单词是Ninja,我希望输出是("N" "Ni" "Nin" "Ninj" "Ninja")

我可以很容易地做到这一点:

user=> (def a "Ninja")

user => (for [x (range 1 (+ 1 (.length a)))]
          (subs a 0 x))

("N" "Ni" "Nin" "Ninj" "Ninja")

这一切都很好......除了......我在那里使用了一个for循环......而且它看起来不是很clojure-y..有没有更好/正确的方法可以在没有for循环的情况下做到这一点还是在这种情况下 for 循环完全没问题?

谢谢

【问题讨论】:

  • 要清楚,Clojure 中的 for 不是 for 循环,它是一个列表推导

标签: for-loop clojure substring


【解决方案1】:

for 理解非常好,IMO。如果您想了解另一种方法,我会这样做:

(map (partial subs a 0) (range 1 (-> a count inc)))
;; ("N" "Ni" "Nin" "Ninj" "Ninja")

【讨论】:

  • 代替(repeat a),只需将a 作为subs 的第一个参数。
  • @A.Webb 不错的建议。现在这几乎是你的答案:)
  • 是的,这就是我删除我的原因:)。
【解决方案2】:

subs 映射到您的for 理解或with map explicitly 中的长度也是我会做的。

但是,如果您真的想要更高级别的功能,您可以使用reductions

(rest (reductions str (str) "Ninja"))
;=> ("N" "Ni" "Nin" "Ninj" "Ninja")

如果您想要后缀,则可以使用 iteratesubs 很好地做到这一点,因为您不必指定结尾。

(take-while seq (iterate #(subs % 1) "Ninja"))
;=> ("Ninja" "inja" "nja" "ja" "a")

【讨论】:

【解决方案3】:

你可以使用reduce

user=> (reduce #(conj % (str (first %) %2)) '() "Ninja")
("Ninja" "Ninj" "Nin" "Ni" "N")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 2016-02-22
    • 2012-03-13
    • 1970-01-01
    • 2011-12-02
    • 1970-01-01
    相关资源
    最近更新 更多