Я хочу преобразовать строку в массив, Я пробовал некоторые шаги, но не получил желаемого результата.
(: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)
Я получаю ниже вывода
((["fruit" "Mango"] ["fruit" "Papaya"]) (["veggie" "Onion"] ["veggie" "Potato"]))
Мне нужна функция clojure, которая возвращает следующий массив
Array
(
[fruit] => Array
(
[0] => Mango
[1] => Papaya
)
[veggie] => Array
(
[0] => Onion
[1] => Potato
)
)





Вам нужен список карт, поэтому вам нужно превратить текущий промежуточный
результаты в карту. Вы можете сделать это с помощью 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 или на каком-то другом языке,
которые неправильно поняли свои базовые структуры данных, и вы на самом деле просто хотите
карта с ключами к массивам значений, вам просто нужно сдвинуть
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"]}
Обратите внимание, что простое использование разделения игнорирует проблемы, когда ;, , и == должны быть разрешены для ключей и значений и используются какие-то кавычки. Использование надлежащего синтаксического анализатора было бы защитным выбором.
еще один вариант - получить все пары с повторной последовательностью и уменьшить ее с помощью группировки:
(->> stringval
(re-seq #"([^,;].+?)==([^,;$]+)")
(reduce (fn [acc [_ k v]] (update acc k conj v)) {}))
;;=> {"fruit" ("Papaya" "Mango"), "veggie" ("Potato" "Onion")}
Вы имеете в виду массив Java? Значит, результат должен иметь ту же структуру, что и результат
(to-array-2d [["Mango" "Papaya"] ["Onion" "Potato"]])?