Если бы я понимаю Ваш вопрос правильно, требуется прочитать файл CSS, внести изменения в класс и затем сохранить те изменения, сохранив файл?
Вы не можете сделать этого с JavaScript/jQuery, работающим от стороны клиента; Вы можете, конечно , изменяют размер шрифта каждого отдельного элемента в DOM, который соответствует классу .classname
CSS, как так
$('.classname').css('font-size','14px');
, но клиентский JavaScript не может получить доступ к файловой системе от веб-браузера, таким образом, Вам был бы нужен некоторый другой путь (т.е. серверный код) для внесения изменений в сам файл CSS.
Вот исправленное решение. Это исправляет ошибку метода add-to-trie Брайана, поскольку в настоящее время он зависит от того, вставляете ли вы последовательности в порядке увеличения длины. Он также позволяет запрашивать дерево по префиксу, что является обычным вариантом использования.
Обратите внимание, что здесь используется больше памяти, поскольку значения хранятся в конечных узлах дерева, поэтому вы можете выполнять поиск.
(defn add-to-trie [trie x]
(assoc-in trie x (merge (get-in trie x) {:val x :terminal true})))
(defn in-trie? [trie x]
"Returns true if the value x exists in the specified trie."
(:terminal (get-in trie x) false))
(defn prefix-matches [trie prefix]
"Returns a list of matches with the prefix specified in the trie specified."
(keep :val (tree-seq map? vals (get-in trie prefix))))
(defn build-trie [coll]
"Builds a trie over the values in the specified seq coll."
(reduce add-to-trie {} coll))
В качестве общего подхода я бы сделал следующее:
Эта проблема очень хорошо поддается рекурсивной реализации. Если возможно, я бы к этому стремился.
Списки здесь очень корявые, не говоря уже о неэффективности. В Clojure более идиоматично использовать векторы, хэш-карты и наборы, когда это необходимо. Использование хэш-карт:
(def in-tree
'((1 2)
(1 2 3)
(1 2 4 5 9)
(1 2 4 10 15)
(1 2 4 20 25)))
(defn add-to-trie [trie x]
(assoc-in trie `(~@x :terminal) true))
(defn in-trie? [trie x]
(get-in trie `(~@x :terminal)))
Если вы хотите распечатать отсортированный, вы можете использовать вместо него sorted-map
s, но вам придется написать свою собственную версию assoc-in
которые использовали отсортированные карты на всем пути вниз. В любом случае:
user> (def trie (reduce add-to-trie {} in-tree))
#'user/trie
user> trie
{1 {2 {4 {20 {25 {:terminal true}}, 10 {15 {:terminal true}}, 5 {9 {:terminal true}}}, 3 {:terminal true}, :terminal true}}}
user> (in-trie? trie '(1 2))
true
user> (in-trie? trie '(1 2 4))
nil
user> (in-trie? trie '(1 2 4 20 25))
true
Я уверен, что есть способ получше (был! См. Ответ Брайана, он лучше):
(defn find-in-trie
"Finds a sub trie that matches an item, eg:
user=> (find-in-trie '(1 (2) (3 (2))) 3)
(3 (2))"
[tr item]
(first (for [ll (rest tr) :when (= (first ll) item)] ll)))
(defn add-to-trie
"Returns a new trie, the result of adding se to tr, eg:
user=> (add-to-trie nil '(1 2))
(1 (2))"
[tr se]
(cond
(empty? se) tr
(empty? tr) (add-to-trie (list (first se)) (rest se))
:else (if-let [st (find-in-trie tr (first se))]
(cons (first tr)
(cons (add-to-trie st (rest se))
(filter (partial not= st) (rest tr))))
(cons (first tr)
(cons (add-to-trie (list (first se)) (rest se))
(rest tr))))))
(def in '((1 2)
(1 2 3)
(1 2 4 5 9)
(1 2 4 10 15)
(1 2 4 20 25)))
(reduce add-to-trie '(nil) in)
-> (nil (1 (2 (4 (20 (25))) (10 (15)) (5 (9))) (3))))
Обратите внимание, что я решил использовать nil в качестве корневого узла и не беспокоился о сохранении пустых списков для обозначения отсутствия дочерних узлов. На самом деле это неверно, так как при этом не сохраняется идентичность подстроки.