Clojure subseq возвращает неверные значения

У меня есть эта отсортированная карта:

(def sm (sorted-map :1 "a" :500 "b" :9999 "c"))
;; {:1 "a", :500 "b", :9999 "c"}

Я пытаюсь получить последовательность со всеми ключами, которые ниже, чем: 1000:

(subseq sm < :1000)

Я ожидал, что результат будет следующим:

([:1 "a"] [:500 "b"])

Но вместо этого я получаю это:

([:1 "a"])

Почему: 1000 между: 1 и: 500 или: 5000 между: 1 и: 500?

Я пробовал то же самое со строковыми или цифровыми клавишами, тот же результат.

Спасибо.

Всего 2 ответа


Ключевые слова сортируются аналогично строкам, а не целочисленным значениям. Если вы хотите сортировать по целочисленным ключам, используйте целочисленные ключи, например, 1, 500, 1000, а не :1 :500 :1000 . Ключи в картах Clojure не обязательно должны быть ключевыми словами.


Ответ Энди уже проясняет вашу проблему, но я хотел отметить, что clojure.data.avl реализует высокопроизводительные отсортированные наборы и карты. Среди множества их особенностей есть поддиапазоны:

 (avl/subrange (avl/sorted-set 0 1 2 3 4 5) > 1)
 ;= #{2 3 4 5}

 (avl/subrange (avl/sorted-set 0 1 2 3 4 5) <= 4)
 ;= #{0 1 2 3 4}

 (avl/subrange (avl/sorted-set 0 1 2 3 4 5) >= 2 < 5)
 ;= #{2 3 4}

Есть идеи?

10000