簡體   English   中英

clojure中如何將字符串轉成數組

[英]How to convert string into an array in clojure

我想將字符串轉換為數組,我嘗試了一些步驟但沒有得到想要的結果。

(:require [clojure.string :as str])

(def stringval "fruit==Mango,fruit==Papaya;veggie==Onion,veggie==Potato")

(defn formatting [strFilters]   
(let [filters (str/split strFilters #";")]
    (for [filter filters]
      (let [eachFilter (str/split filter #",")]
        (for [each eachFilter]
          (let [items (str/split each #"==")]
            items
            )))))) 
(formatting stringval)

我低於 output

((["fruit" "Mango"] ["fruit" "Papaya"]) (["veggie" "Onion"] ["veggie" "Potato"]))

我想要 clojure function 返回下面的數組

Array
(
    [fruit] => Array
        (
            [0] => Mango
            [1] => Papaya
        )

    [veggie] => Array
        (
            [0] => Onion
            [1] => Potato
        )

)

你想要一個地圖列表,所以你必須把你當前的中間結果變成一個 map。你可以用group-by和一些后處理來做到這一點,或者你可以使用merge-with conj如果你從內心深處for它做准備。 另請注意, for可以包含:let

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

(def s "fruit==Mango,fruit==Papaya;veggie==Onion,veggie==Potato")

(for [g (str/split s #";")]
  (apply merge-with into
         (for [kv (str/split g #",")
               :let [[k v] (str/split kv #"==")]]
           {k [v]})))
; → ({"fruit" ["Mango" "Papaya"]} {"veggie" ["Onion" "Potato"]})

如果你的目標輸出來自 PHP 或其他一些語言,它們的基本數據結構是錯誤的,而你實際上只想要一個 map 和 arrays 的鍵值,你只需要將merge-with into出來,你也可以分裂; 並且,一舉。

(apply merge-with into
       (for [kv (str/split s #"[;,]")
             :let [[k v] (str/split kv #"==")]]
         {k [v]}))
; → {"fruit" ["Mango" "Papaya"], "veggie" ["Onion" "Potato"]}

另一種選擇是使用 re-seq 獲取所有對並通過分組減少它:

(->> stringval
     (re-seq #"([^,;].+?)==([^,;$]+)")     
     (reduce (fn [acc [_ k v]] (update acc k conj v)) {}))

;;=> {"fruit" ("Papaya" "Mango"), "veggie" ("Potato" "Onion")}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM