miércoles, 17 de febrero de 2021

Primeros pasos con Clojure, parte 24

 


 Seguimos con Clojure... 

Hay otras dos funciones que son útiles para comprobar si un mapa contiene una entrada.


user=> (contains? scores "Fred")
true

user=> (find scores "Fred")
["Fred" 1400]

La función contains? es un predicado para verificar la contención. La función find busca la entrada clave / valor en un mapa, no solo el valor.

También puede obtener solo las claves o solo los valores en un mapa:

user=> (keys scores)
("Fred" "Bob" "Angela")

user=> (vals scores)
(1400 1240 1024)

Si bien los mapas están desordenados, existe la garantía de que las funciones keys, vals y otras corran en orden de "secuencia" siempre recorrerán las entradas de una instancia de mapa en particular en el mismo orden.

La función zipmap se puede utilizar para "comprimir" juntas dos secuencias (las claves y los valores) en un mapa:

user=> (def players #{"Alice" "Bob" "Kelly"})
#'user/players

user=> (zipmap players (repeat 0))
{"Kelly" 0, "Bob" 0, "Alice" 0}

La función de merge se puede utilizar para combinar varios mapas en un solo mapa:

user=> (def new-scores {"Angela" 300 "Jeff" 900})
#'user/new-scores

user=> (merge scores new-scores)
{"Fred" 1400, "Bob" 1240, "Jeff" 900, "Angela" 300}

Si ambos mapas contienen la misma clave, gana el de la derecha. Alternativamente, puede usar merge-with para proporcionar una función para invocar cuando hay un conflicto:

user=> (def new-scores {"Fred" 550 "Angela" 900 "Sam" 1000})
#'user/new-scores

user=> (merge-with + scores new-scores)
{"Sam" 1000, "Fred" 1950, "Bob" 1240, "Angela" 1924}

En el caso de un conflicto, se llama a la función en ambos valores para obtener el nuevo valor.

De forma similar a los conjuntos ordenados, los mapas ordenados mantienen las claves ordenadas según un comparador, utilizando comparar como función de comparación predeterminada.

user=> (def sm (sorted-map
         "Bravo" 204
         "Alfa" 35
         "Sigma" 99
         "Charlie" 100))
{"Alfa" 35, "Bravo" 204, "Charlie" 100, "Sigma" 99}

user=> (keys sm)
("Alfa" "Bravo" "Charlie" "Sigma")

user=> (vals sm)
(35 204 100 99)


No hay comentarios.:

Publicar un comentario