Clojure-将字符串拆分两次并转换为映射(noob)
为努布的问题道歉,而不是努力开始与Clojure 我有一个字符串Clojure-将字符串拆分两次并转换为映射(noob),clojure,Clojure,为努布的问题道歉,而不是努力开始与Clojure 我有一个字符串“买=1 |卖=2 |限=3 |停=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 |卖=2 |限=3 |停=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)
我试图传递一个部分应用的函数,但怀疑语法是否正确。我将分隔符作为第一个参数传递给函数,但是应该首先传递要拆分的字符串,因此这肯定是不正确的
任何关于更惯用的方法的建议都会受到感激。这是一种方法:
(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"}
这是一种方法:
(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"}
我会给你
(“买入”1)(“卖出”2)(“限制”3)(“止损”4)()
现在我们将其简化为{},并在1中转换为“1”,在:buy中转换为“buy”
这给了你
{:停止4,:限制3,:卖出2,:买入1}
可能不是最好的,但简单明了,效果很好
我会给你
(“买入”1)(“卖出”2)(“限制”3)(“止损”4)()
现在我们将其简化为{},并在1中转换为“1”,在:buy中转换为“buy”
这给了你
{:停止4,:限制3,:卖出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}
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}
在映射调用中,第一个参数必须是允许一个参数的函数。因此,您的尝试没有那么远:
(map);(str/split%\=)(str/split line);(str/split line);(请注意,(…%)
正是我缺少的,谢谢!在您的map调用中,第一个参数必须是一个函数,它允许一个参数。所以您的尝试没有那么远:(map);(str/split%\);(str/split%\=););(str/split line);“\”;(str/split line);)
(注意,#(…%…)
正是我缺少的,谢谢!