2014-11-20 2 views
0

Я изучаю clojure и пытаюсь реализовать проблему. Я храню карты в векторе. Каждая карта содержит идентификатор. Например, [{:id 1 :name "abc"} {:id 2 :name "xyz"}]. На карте также есть еще несколько полей.Пример массива в clojure

Я где-то читал, что вместо того, чтобы использовать вектор для хранения карт, я мог бы использовать массив-карту и уничтожить свой идентификатор и сохранить его как-то вроде {1 {:name "abc"}, 2 {:name "xyz"}}.

Я попытался пройти документы clojure, но не нашел хорошего примера для достижения этого. Может кто-нибудь, пожалуйста, помогите мне и дайте мне хороший пример?

ответ

0

Вы можете использовать assoc, чтобы добавить значения к карте. assoc принимает 3 аргумента. Первый arg - это карта, которую вы хотите добавить, 2nd arg - это ключ, а третий - значение. Функция возвращает старую карту с добавленной парой ключ-значение.

Пример:

(assoc {} 1 {:name "abc"}) 

возвращает

{1 {:name "abc"}} 
0

Ваша идея поднять :id запись каждой зачетной карты в индексе, при удалении его из карты. В итоге вы получаете карту :id без записей, а не вектор полных записей.

Следующая функция поднимает ключ fk из коллекции карт ms:

(defn key-by [fk ms] 
    (into {} (map (fn [m] [(get m fk) (dissoc m fk)]) ms))) 

Например,

(key-by :id [{:id 1 :name "abc"} {:id 2 :name "xyz"}]) 
;{1 {:name "abc"}, 2 {:name "xyz"}} 

Примечание:

  • Каждая запись должна иметь :id ,
  • Ваш :id s лучше быть отличным, или вы потеряете записи.
  • Не зависит от array-map: это деталь реализации. A измененная версия вполне может быть hash-map.
    • Если вам нужна ваша карта, отсортированная по ключу, используйте sorted-map.
    • Если вам нужно сохранить свои записи в порядке ввода, подумайте еще раз.
+0

Хорошо я получить то, что вы говорите, пытаетесь сказать, я буду думать, если я действительно нужен массив-карту (или любую карту по этому вопросу) или просто держать его в векторе –

Смежные вопросы