Clojure subseq возвращает неверные значения - PullRequest
0 голосов
/ 24 марта 2020

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

(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 ]

4 голосов
/ 24 марта 2020

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

1 голос
/ 25 марта 2020

Ответ Энди уже проясняет вашу проблему, но я хотел отметить, что 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...