2013-05-16 24 views
7

Tôi có một chuỗi trong Clojure và một ký tự mà tôi muốn đặt ở giữa ký tự thứ n và (n + 1). Ví dụ: Cho phép nói chuỗi là "aple" và tôi muốn chèn một "p" khác giữa "p" và "l".Clojure: Cách thành ngữ để chèn một Char vào một chuỗi

(prn 
    (some-function "aple" "p" 1 2)) 

    ;; prints "apple" 
    ;; ie "aple" -> "ap" "p" "le" and the concatenated back together. 

Tôi thấy điều này hơi khó khăn, vì vậy tôi cho rằng tôi thiếu thông tin về một số chức năng hữu ích (s) Ai đó có thể giúp tôi viết "một số chức năng" ở trên có chuỗi, một chuỗi khác, vị trí bắt đầu và vị trí kết thúc và chèn chuỗi thứ hai vào vị trí đầu tiên giữa vị trí bắt đầu và vị trí kết thúc? Cảm ơn trước!

Trả lời

11

More hiệu quả hơn so với sử dụng các hàm seq:

(defn str-insert 
    "Insert c in string s at index i." 
    [s c i] 
    (str (subs s 0 i) c (subs s i))) 

Từ REPL:

user=> (str-insert "aple" "p" 1) 
"apple" 

NB. Hàm này không thực sự quan tâm đến loại c hoặc độ dài của nó trong trường hợp của một chuỗi; (str-insert "aple" \p 1)(str-insert "ale" "pp" 1) cũng hoạt động (nói chung, (str c) sẽ được sử dụng, là chuỗi trống nếu cnil(.toString c) nếu không).

Vì câu hỏi yêu cầu một cách thành ngữ để thực hiện nhiệm vụ, tôi cũng sẽ lưu ý rằng tôi thấy nó thích hợp hơn (về mặt ngữ nghĩa) ngoài lợi thế hiệu suất) để sử dụng các hàm định hướng chuỗi xử lý các chuỗi cụ thể; điều này bao gồm subs và các chức năng từ clojure.string. Xem the design notes at the top of the source of clojure.string để thảo luận về xử lý chuỗi thành ngữ.

+2

Nhân tiện, sự khác biệt về tốc độ khá rõ rệt. Điểm chuẩn nhanh chóng của Criterium cho tôi biết '(str-insert" aple "" p "1)' mất khoảng 180 ns, nhỏ hơn 12,5 lần so với phiên bản 2.25 µs dựa trên seq. –

+1

Lưu ý 'subs' bao bọc 'chuỗi con' và' str' của Java sử dụng 'StringBuilder'. Tôi không nghĩ rằng nó có thể làm tốt hơn. –

Các vấn đề liên quan