Al iterar a través del mapa devuelto en el código, devuelto por la función de tema, las claves no aparecen en orden.
¿Cómo puedo hacer que las claves estén en orden / ordenar el mapa para que las claves estén en orden y los valores correspondan?
Aquí está el código .
Respuestas:
El blog Go: Go Maps in action tiene una excelente explicación.
Aquí está mi versión modificada del código de ejemplo: http://play.golang.org/p/dvqcGPYy3-
Salida:
fuente
keys := make([]int, len(m))
y luego insertar por índice enkeys[i] = k
lugar deappend
De acuerdo con la especificación Go , el orden de iteración sobre un mapa no está definido y puede variar entre las ejecuciones del programa. En la práctica, no solo no está definido, sino que en realidad está intencionalmente aleatorizado. Esto se debe a que solía ser predecible, y los desarrolladores del lenguaje Go no querían que las personas confiaran en un comportamiento no especificado, por lo que lo aleatorizaron intencionalmente para que confiar en este comportamiento fuera imposible.
Lo que tendrá que hacer, entonces, es colocar las claves en un segmento, ordenarlas y luego recorrer el segmento de esta manera:
fuente
Todas las respuestas aquí ahora contienen el antiguo comportamiento de los mapas. En Go 1.12+, puede imprimir un valor de mapa y se ordenará por clave automáticamente. Esto se ha agregado porque permite probar fácilmente los valores del mapa.
Leer más aquí .
fuente
Si, como yo, descubre que desea esencialmente el mismo código de clasificación en más de un lugar, o simplemente desea mantener baja la complejidad del código, puede abstraer la clasificación en una función separada, a la que le pasa la función que hace el trabajo real que desea (que sería diferente en cada sitio de llamada, por supuesto).
Dado un mapa con el tipo de clave
K
y el tipo de valorV
, representado como<K>
y a<V>
continuación, la función de clasificación común podría parecerse a esta plantilla de código Go (que la versión 1 de Go no admite tal como está):Luego llámelo con el mapa de entrada y una función (tomando
(k <K>, v <V>)
como argumentos de entrada) que se invoca sobre los elementos del mapa en orden de clave ordenada.Entonces, una versión del código en la respuesta publicada por Mingu podría verse así:
La
sortedMapIntString()
función se puede reutilizar para cualquiermap[int]string
(suponiendo que se desee el mismo orden de clasificación), manteniendo cada uso en solo dos líneas de código.Las desventajas incluyen:
Otros idiomas tienen varias soluciones:
<K>
y<V>
(para denotar tipos para la clave y el valor) parece un poco familiar, esa plantilla de código no es muy diferente a las plantillas de C ++.range
un tipo de primera clase que pueda ser sustituido por uno personalizadoordered-range
(en lugar delrange
código original), creo que algunos otros lenguajes proporcionan iteradores que son lo suficientemente potentes para lograr lo mismo cosa.fuente
En respuesta a James Craig Burley respuesta . Para hacer un diseño limpio y reutilizable, se puede optar por un enfoque más orientado a objetos. De esta forma, los métodos se pueden vincular de forma segura a los tipos del mapa especificado. Para mí, este enfoque se siente más limpio y organizado.
Ejemplo:
Ejemplo de área de juegos extendida con múltiples tipos de mapas.
Nota IMPORTANTE
En todos los casos, el mapa y el segmento ordenado se desacoplan desde el momento en que
for
finaliza el bucle sobre el maparange
. Lo que significa que, si el mapa se modifica después de la lógica de clasificación, pero antes de usarlo, puede tener problemas. (No hilo / Ir a rutina segura). Si hay un cambio en el acceso de escritura del mapa paralelo, necesitará usar un mutex alrededor de las escrituras y elfor
ciclo ordenado .fuente
Esto le proporciona el ejemplo de código sobre el mapa de clasificación. Básicamente esto es lo que proporcionan:
y esto es lo que sugeriría usar en su lugar :
El código completo se puede encontrar en este Go Playground .
fuente