在clojure中生成子串

时间:2014-04-08 16:21:08

标签: for-loop clojure substring

我试图在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循环..它看起来并不是很好看的...有没有更好/正确的方法来做到这一点for循环还是for循环完全没问题呢?

谢谢

3 个答案:

答案 0 :(得分:4)

IMO,

for理解完全没问题。如果你想看到另一种方法,我会这样做:

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

答案 1 :(得分:4)

subs理解或with map explicitly中完成for的长度映射也是我所做的。

但是,如果确实需要更高级别的功能,则可以使用reductions

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

如果你想要后缀,你可以很好地使用iteratesubs,因为你不必指定结尾。

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

答案 2 :(得分:1)

您可以使用reduce

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