Sorted sets em Clojure


Sorted Sets são conjuntos cujos elementos são organizados automaticamente de acordo com uma função comparadora.

Por padrão, utilizam a função compare do Clojure, que aplica a “ordem natural” para números e Strings.

Podem ser criados com a função sorted-set.

(conj (sorted-set) "Bravo" "Charlie" "Sigma" "Alpha")
;; => #{"Alpha" "Bravo" "Charlie" "Sigma"}

Para ordenações personalizadas, utiliza-se a função sorted-set-by junto a um comparador customizado.

No exemplo abaixo, um conjunto que ordena as palavras pelo seu comprimento.

(def comparador-tamanho
  (fn [s1 s2]
    (let [c1 (count s1)
          c2 (count s2)]
      (if (== c1 c2)
        (compare s1 s2)    ; Se o tamanho for igual, ordena alfabeticamente
        (compare c1 c2))))) ; Caso contrário, ordena pelo tamanho
 
(def palavras-ordenadas 
  (sorted-set-by comparador-tamanho "banana" "uva" "maçã" "pera"))
 
;; Resultado:
;; #{"uva" "maçã" "pera" "banana"}

NOTE

A função comparadora deve aceitar dois argumentos e e retornar:

  • Uma número negativo se
  • Zero se
  • Uma número positivo se

Referências


https://clojure.org/guides/learn/hashed_colls#_sorted_sets