Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure-将字符串拆分两次并转换为映射(noob)_Clojure - Fatal编程技术网

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

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=

为努布的问题道歉,而不是努力开始与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" "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);)
(注意,
#(…%…)
正是我缺少的,谢谢!