Если я вызываю ключи на отсортированной карте, гарантируется ли полученная последовательность в отсортированном порядке?

Если бы я вызывал keys на sorted-map, я предполагаю, что результирующий seq будет в том же порядке, что и пары ключ-значение на карте.

Однако пользователь из ClojureDocs по имени Jarzka примерно 2 года назад сказал следующее:

Я заметил, что ключи не всегда возвращаются в одном и том же порядке. Обычно они есть, но не всегда.

(К сожалению, я не могу напрямую дать ссылку на комментарий. Он находится внизу страницы с описанием keys.)

Почему это может быть? Должен ли я (sort (keys m)) на всякий случай?

(def m (sorted-map :a 1, :b 2, :c 3))

(def maybe-unsorted-keys? (keys m))
(def sorted-keys (sort (keys m))) 

person Community    schedule 25.12.2017    source источник


Ответы (2)


Если вы посмотрите на реализацию ключей и значений, это выглядит как правильное предположение, что они будут возвращены в том же порядке, отсортированном:

https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentTreeMap.java#L888

person Michiel Borkent    schedule 25.12.2017

Документы для keys и для vals читается следующим образом:

  • Возвращает последовательность ключей карты в том же порядке, что и (seq map).
  • Возвращает последовательность значений карты в том же порядке, что и (seq map)

Таким образом, независимо от того, отсортирована карта или нет, результаты вызова (keys m) и (vals m) будут соответствовать 1-к-1. Поскольку sorted-map сортируется по ключам, результат (keys srt-map) будет отсортирован.

person Alan Thompson    schedule 26.12.2017