Trier les valeurs Go map par clés

Lors de l'itération à travers la carte retournée dans le code, retournée par la fonction topic, les clés n'apparaissent pas dans l'ordre.

Comment puis-je obtenir les clés pour être dans l'ordre / trier la carte afin que les clés soient dans l'ordre et que les valeurs correspondent?

Voici le code .

56
demandé sur Tim Cooper 2014-04-28 04:34:31

2 réponses

Le Aller blog: Allez les cartes dans l'action est une excellente explication.

Lors de l'itération sur une carte avec une boucle de plage, l'ordre d'itération est non spécifié et n'est pas garanti pour être le même à partir d'une itération pour la prochaine. Depuis Go 1, le runtime randomise l'ordre d'itération de la carte, comme les programmeurs se sont appuyés sur l'ordre d'itération stable du précédent application. Si vous avez besoin d'un ordre d'itération stable vous devez maintenir une structure de données distincte qui spécifie cette commande.

Voici ma version modifiée de l'exemple de code: http://play.golang.org/p/dvqcGPYy3-

package main

import (
    "fmt"
    "sort"
)

func main() {
    // To create a map as input
    m := make(map[int]string)
    m[1] = "a"
    m[2] = "c"
    m[0] = "b"

    // To store the keys in slice in sorted order
    var keys []int
    for k := range m {
        keys = append(keys, k)
    }
    sort.Ints(keys)

    // To perform the opertion you want
    for _, k := range keys {
        fmt.Println("Key:", k, "Value:", m[k])
    }
}

Sortie:

Key: 0 Value: b
Key: 1 Value: a
Key: 2 Value: c
96
répondu Mingyu 2014-04-28 03:42:10

Selon la spécification Go , l'ordre d'itération sur une carte n'est pas défini et peut varier entre les exécutions du programme. En pratique, non seulement il est indéfini, mais il est en fait intentionnellement randomisé. C'est parce qu'il était prévisible, et les développeurs de langage Go ne voulaient pas que les gens se fient à un comportement non spécifié, donc ils l'ont intentionnellement randomisé pour qu'il soit impossible de s'appuyer sur ce comportement.

Ce que vous aurez à faire, alors, est de tirer les clés dans une tranche, triez-les, puis passez sur la tranche comme ceci:

var m map[keyType]valueType
keys := sliceOfKeys(m) // you'll have to implement this
for _, k := range keys {
    v := m[k]
    // k is the key and v is the value; do your computation here
}
10
répondu joshlf 2014-04-28 03:23:17