我试图在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循环完全没问题呢?
谢谢
答案 0 :(得分:4)
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")
如果你想要后缀,你可以很好地使用iterate
和subs
,因为你不必指定结尾。
(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")