2015-08-13 17 views
0

道歉的總諾伊問題,而不是努力開始與Clojure。Clojure - 分割一個字符串兩次,並轉換爲一個地圖(noob)

我有一個字符串"buy=1|sell=2|limit=3|stop=4",我試圖把它變成一個地圖

:buy 1 
:sell 2 
:limit 3 
:stop 4 

到目前爲止,我

(require '[clojure.string :as str]) 
=> nil 

(def line "buy=1|sell=2|limit=3|stop=4") 
=> #'user/line 

(str/split line #"\|") 
=> ["buy=1" "sell=2" "limit=3" "stop=4"] 

現在拆我想我想映射第二次一個功能到SEQ,所以像

map (str/split #"\=") (str/split line #"\|") 
=> ArityException Wrong number of args (1) passed to: string/split clojure.lang.AFn.throwArity (AFn.java:429) 

我試圖通過一個部分應用函數,但懷疑我的語法正確。我傳遞分隔符作爲函數的第一個參數,但是要分割的字符串應該先傳遞,這樣肯定是不正確的。

任何指向一個更習慣的方式來做到這一點感激地收到。

+1

在地圖調用第一個參數必須是一個函數,允許一個參數。所以你的嘗試不是那麼遠:'(map#(str/split%#「\ =」)(str/split line#「\ |」))'(注意'#(..%...) ' – cfrick

+0

正是我想念的,謝謝! – cms550790

回答

1

這是做這件事的一種方法:

(def st "buy=1|sell=2|limit=3|stop=4") 
(->> (clojure.string/split st #"\|") 
    (map #(re-matches #"(.+)=(.+)" %)) 
    (map (fn [[_ key value]] [(keyword key) value])) 
    (into {})) 

返回:

{:buy "1", :sell "2", :limit "3", :stop "4"} 
2
(def s "buy=1|sell=2|limit=3|stop=4") 

(partition 2 (clojure.string/split s #"[=|]")) 

會給你

(( 「買入」 和 「1」)( 「sell」「2」)(「limit」「3」)(「stop」「4」))

我們現在減少到{}和改造 「1」 1,在 「買」:買

(reduce (fn [acc [k v]] (assoc acc (keyword k) (Integer. v))) {} (partition 2 (clojure.string/split s #"[=|]"))) 

,讓你

{:停止4:限3 ,:賣2,:買1}

可能不是最好的,但直接和工作。

1

re-seq這裏是你的朋友....

(def s "buy=1|sell=2|limit=3|stop=4") 
(->> s                           
    (re-seq #"(\w+)=(\d+)")                      
    (map (fn [[_ k v]] [(keyword k) (Integer/parseInt v)]))              
    (into {})) 
;=> {:buy 1, :sell 2, :limit 3, :stop 4} 
相關問題