Манипулирование строками в Clojure - PullRequest
0 голосов
/ 31 декабря 2018

Я новичок в Clojure.У меня есть Java HashMap, который имеет целое число в качестве ключей и список массивов в качестве значений.Карта: {1 = [Дели, Гоа, Мумбаи], 2 = [привет, мир, мир, потрясающий]}.Я хочу заменить мир на ночь и привет на добро.Я делаю что-то вроде этого.

Код Clojure:

(doseq [[k v] m]
  (when (= k 2)
    (doseq [s v]
      (if (= s "world")
        (def a(clojure.string/replace(s #"world" "night"))))
      (if (= s "hello")
        (def b(clojure.string/replace(s #"hello" "good")))))))

Это не работает идеально.Кроме того, когда я пытаюсь напечатать значения a и b, он показывает

#object[clojure.lang.Var$Unbound 0x31791dc5 Unbound: #'com.example.core/a] and #object[clojure.lang.Var$Unbound 0x31791dc5 Unbound: #'com.example.core/b]. 

Как я могу увидеть значение a ie night и b ie good.Есть ли другой способ манипуляции со строками?Любая помощь будет по достоинству оценена.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

комбинация update и replace поможет:

user> (def data {1 ["Delhi" "Goa" "Mumbai"]
                 2 ["hello" "world" "the" "world" "is" "awesome"]})

user> (update data 2 #(replace {"world" "night" "hello" "good"} %))
;;=> {1 ["Delhi" "Goa" "Mumbai"], 2 ["good" "night" "the" "night" "is" "awesome"]}
0 голосов
/ 31 декабря 2018

Есть несколько разных подходов к этому.Допустим, у вас есть

(def data {1 ["hello" "world"]})

Простой способ

(def modified (assoc data 1 ["good" "night"])) 
;; {1 ["good" "night"]}

Это просто возвращает новую структуру данных со значением, замененным на 1, для нового вектора соответствующих элементов.Но это работает только для довольно простых вещей, когда вы точно знаете, что находится в векторе.

Менее простой способ

(def result
  (into (sorted-map)
        (map
          (fn [[k v]]
            (if (some #{"hello" "world"} v)
                [k (assoc (assoc v (.indexOf v "hello") "good") 
                          (.indexOf v "world") 
                          "night")]
                [k v]))
          (seq data))))

(print result) ; {1 ["good" "night"]}

Здесь seq, вызываемый на карте, возвращает ленивую последовательностькортежи ключ / значение.Мы отображаем те с помощью функции, которая проверяет значения, которые мы хотим заменить, и возвращает либо новый кортеж ключ / значение со словами, замененными на соответствующие знаки в векторе, либо оригинал, если «привет» / «мир» не находятся ввектор.Затем into превращает его обратно в карту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...