2011-01-29 8 views
21

Tôi đang tìm cách tạo danh sách các ký tự bằng cách sử dụng chuỗi làm nguồn của tôi. Tôi đã làm một chút googling và đến với không có gì để sau đó tôi đã viết một chức năng mà đã làm những gì tôi muốn:Tạo danh sách từ một chuỗi trong Clojure

(defn list-from-string [char-string] 
    (loop [source char-string result()] 
    (def result-char (string/take 1 source)) 
    (cond 
    (empty? source) result 
    :else (recur (string/drop 1 source) (conj result result-char))))) 

Nhưng nhìn vào điều này làm cho tôi cảm thấy như tôi phải mất một thủ thuật.

  1. Có chức năng lõi hoặc đóng góp nào thực hiện việc này cho tôi không? Chắc chắn tôi chỉ là câm phải không?
  2. Nếu không có cách nào để cải thiện mã này?
  3. Điều tương tự cũng có hiệu quả đối với các con số không?

Trả lời

42

Bạn chỉ có thể sử dụng seq chức năng để làm điều này:

user=> (seq "aaa") 
(\a \a \a) 

cho số điện thoại bạn có thể sử dụng "câm" giải pháp, một cái gì đó như:

user=> (map (fn [^Character c] (Character/digit c 10)) (str 12345)) 
(1 2 3 4 5) 

T.B. chuỗi trong clojure là 'seq'able, vì vậy bạn có thể sử dụng chúng làm nguồn cho bất kỳ chức năng xử lý chuỗi - bản đồ, cho, ...

+0

Xin chào! Ý nghĩa của [^ Character c] là gì?^Ký tự để sử dụng Ký tự/chữ số bên trong? – Polak

+2

đây là loại gợi ý, mà không có nó clojure sẽ sử dụng sự phản ánh để xác định loại đối số. Điều này làm cho chức năng này hơi nhanh hơn ... –

17

nếu bạn biết đầu vào sẽ là chữ cái, chỉ cần sử dụng

user=> (seq "abc") 
(\a \b \c) 

cho số, hãy thử này

user=> (map #(Character/getNumericValue %) "123") 
(1 2 3) 
6

chỉnh sửa: Rất tiếc, nghĩ rằng bạn muốn có một danh sách các nhân vật khác nhau. Đối với điều đó, sử dụng chức năng lõi "tần số".

clojure.core/frequencies 
([coll]) 
    Returns a map from distinct items in coll to the number of times they appear. 

Ví dụ:

user=> (frequencies "lazybrownfox") 
{\a 1, \b 1, \f 1, \l 1, \n 1, \o 2, \r 1, \w 1, \x 1, \y 1, \z 1} 

Sau đó, tất cả các bạn phải làm là lấy chìa khóa và biến chúng thành một chuỗi (hay không).

user=> (apply str (keys (frequencies "lazybrownfox"))) 
"abflnorwxyz" 
+0

Cảm ơn. Tôi không muốn nhận được tần số nhưng tôi đã quan tâm đến mẹo không-ít hơn. – robertpostill