Digamos que tenemos un mapa y queremos encontrar un par clave-valor específico, pero se puede ubicar en cualquier orden, por lo que para tener el mapa en Golang en un orden particular, podemos ordenar el mapa por sus claves o valores. En este artículo, veremos cómo ordenar un mapa en go lang por sus claves o valores.
Ordenar por claves
Para ordenar un mapa por valores, primero debemos crear una lista de claves en ese mapa (cortes en Golang). De forma predeterminada, Golang imprime el mapa con claves ordenadas, pero al iterar sobre un mapa, sigue el orden de las claves que aparecen tal como están.
Entonces, para ordenar las claves en un mapa en Golang, podemos crear una porción de las claves y ordenarla y, a su vez, ordenar la porción. En primer lugar, iteramos sobre el mapa y agregamos todas las claves en el segmento. Una vez que tengamos todas las claves, usaremos la función sort.String para ordenar el segmento alfabéticamente. Esto dará una porción ordenada/lista de claves del mapa. Después de eso, podemos simplemente iterar sobre este segmento y acceder al valor de la clave en el mapa.
Go
// Go program to sort the map by Keys package main import ( "fmt" "sort" ) func main() { basket := map[string]int{"orange": 5, "apple": 7, "mango": 3, "strawberry": 9} keys := make([]string, 0, len(basket)) for k := range basket{ keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { fmt.Println(k, basket[k]) } }
Producción:
Podemos ver que pudimos iterar sobre el mapa ordenando las claves de un mapa. Las claves también se pueden clasificar en orden descendente utilizando la función Sort.Reverse .
Simplemente reemplazamos sort.Strings(keys ) con sort.Sort(sort.Reverse(sort.StringSlice(keys))) para obtener el segmento en orden alfabético descendente.
Go
// Go program to sort the map by Keys package main import ( "fmt" "sort" ) func main() { basket := map[string]int{"orange": 5, "apple": 7, "mango": 3, "strawberry": 9} keys := make([]string, 0, len(basket)) for k := range basket{ keys = append(keys, k) } sort.Sort(sort.Reverse(sort.StringSlice(keys))) for _, k := range keys { fmt.Println(k, basket[k]) } }
Producción:
Por lo que las claves se obtienen en orden inverso al del mapa original. Puede modificar aún más los criterios de clasificación con varias funciones en el módulo de clasificación.
Ordenar por valores
Incluso podemos iterar sobre el mapa ordenando los valores, para eso necesitamos usar la función sort.SliceStable.
En primer lugar, similar al método de clasificación por clave, tenemos que obtener una porción de todas las claves. Ahora queremos ordenar las claves según los valores, para hacer eso, usamos la función SliceStable en el módulo de ordenación. La función slicestable toma el segmento y podemos proporcionar menos función. Simplemente podemos proporcionar una ficción anónima/lambda que verifique la comparación de los valores del segmento proporcionado. Comparamos la clave en el índice i-ésimo en el mapa para que se convierta en map[slice[i]], aquí keys es una porción de todas las claves en el mapa y, por lo tanto, accedemos a cada clave desde el mapa. Entonces, después de esto, deberíamos tener una porción ordenada de claves según el valor de esas claves.
Podemos probar la salida hasta ahora con el siguiente script.
Go
// Go program to sort the map by Values package main import ( "fmt" "sort" ) func main() { basket := map[string]int{"orange": 5, "apple": 7, "mango": 3, "strawberry": 9} keys := make([]string, 0, len(basket)) for key := range basket { keys = append(keys, key) } fmt.Println(basket) fmt.Println(keys) sort.SliceStable(keys, func(i, j int) bool{ return basket[keys[i]] < basket[keys[j]] }) fmt.Println(keys) }
Producción:
Aquí podemos ver que las claves en el segmento han sido ordenadas por valores en orden ascendente como [mango, naranja, manzana, fresa] que tienen el valor [3, 5, 7, 9] respectivamente. Además, tenemos que iterar sobre el empalme de claves e imprimir las claves y valores en el mapa.
Go
// Go program to sort the map by Values package main import ( "fmt" "sort" ) func main() { basket := map[string]int{"orange": 5, "apple": 7, "mango": 3, "strawberry": 9} keys := make([]string, 0, len(basket)) for key := range basket { keys = append(keys, key) } sort.SliceStable(keys, func(i, j int) bool{ return basket[keys[i]] < basket[keys[j]] }) for _, k := range keys{ fmt.Println(k, basket[k]) } }
Producción:
Entonces, hemos iterado sobre el mapa en orden ascendente de sus valores. Las claves aquí representan el empalme, así que repítalo con el iterador k y un identificador en blanco como índice de los elementos . Entonces, simplemente accedemos a la clave con k y el valor usando el mapa [k], en este caso, el mapa es la canasta.
Si queremos iterar sobre el mapa ordenando en orden descendente los valores, simplemente tenemos que modificar los contenidos en la función SpliceStable less.
Go
package main import ( "fmt" "sort" ) func main() { basket := map[string]int{"orange": 5, "apple": 7, "mango": 3, "strawberry": 9} keys := make([]string, 0, len(basket)) for key := range basket { keys = append(keys, key) } sort.SliceStable(keys, func(i, j int) bool{ return basket[keys[i]] > basket[keys[j]] }) for _, k := range keys{ fmt.Println(k, basket[k]) } }
Producción:
Entonces, al cambiar el valor de retorno de la función menos a mayor que el operador, pudimos ordenar el mapa en orden descendente. Pudimos iterar sobre el mapa ordenando las claves en orden ascendente/descendente. De manera similar, pudimos iterar sobre el mapa ordenando los valores de las claves en orden ascendente y descendente. Por lo tanto, pudimos ordenar un mapa por sus claves y valores en Golang.