Clojure - 将字符串拆分两次并转换为地图(noob)

时间:2015-08-13 05:35:52

标签: clojure

为总的noob问题道歉,而不是努力开始使用Clojure。

我有一个字符串"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)

我正在尝试传递部分应用的函数,但怀疑我的语法是否正确。我传递分隔符作为函数的第一个参数,但是要分割的字符串应该首先传递,所以这肯定是不正确的。

任何有关更加惯用的方式的指示都会感激不尽。

3 个答案:

答案 0 :(得分:2)

(def s "buy=1|sell=2|limit=3|stop=4")

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

会给你

  

(("购买"" 1")("销售"" 2")("限制"& #34; 3")("停止"" 4")

现在我们缩减为{}并转换" 1" 1,"买" in:购买

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

给你

  

{:停止4,:限制3,:卖2,买1}

可能不是最好的,但是直截了当且有效。

答案 1 :(得分: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 :(得分: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}