Itération des cartes dans l'ordre d'insertion
Les cartes Go ne garantissent pas l'ordre des itérations, ce qui rend difficile la récupération des éléments de la carte dans l'ordre dans lequel ils ont été insérés . Pour résoudre ce problème, envisagez les approches suivantes :
Utilisation d'une tranche de clés
Gérez une tranche distincte pour suivre les clés dans l'ordre d'insertion. Chaque fois que vous ajoutez une paire clé-valeur à la carte, vérifiez si la clé existe dans la tranche. Sinon, ajoutez-le. Lorsque vous parcourez la carte, utilisez la tranche de touches pour accéder aux éléments.
type Map struct { m map[Key]Value keys []Key } func (m *Map) Set(k Key, v Value) { if _, ok := m.m[k]; !ok { m.keys = append(m.keys, k) } m.m[k] = v } func (m *Map) Range() { for _, k := range m.keys { fmt.Println(m.m[k]) } }
Utilisation d'un wrapper de valeurs de liste chaînée
Enveloppez les valeurs de la carte avec une structure de données qui stocke la valeur et un pointeur vers la clé suivante dans l’ordre d’insertion. Chaque fois que vous ajoutez une paire clé-valeur, mettez à jour le pointeur suivant du wrapper de valeur précédent. Pour itérer dans l'ordre d'insertion, commencez par la première clé et suivez les pointeurs suivants.
type valueWrapper struct { value Value next *Key } type Map struct { m map[Key]valueWrapper first, last *Key } func (m *Map) Set(k Key, v Value) { if _, ok := m.m[k]; !ok && m.last != nil { w2 := m.m[*m.last] m.m[*m.last] = valueWrapper{w2.v, &k} } w := valueWrapper{v: v} m.m[k] = w if m.first == nil { m.first = &k } m.last = &k } func (m *Map) Range() { for k := m.first; k != nil; { w := m.m[*k] fmt.Println(w.v) k = w.next } }
Ces solutions répondent à la nécessité de maintenir l'ordre d'insertion tout en préservant les avantages de la carte. En séparant le suivi des touches des opérations sur la carte ou en liant les valeurs dans l'ordre, vous pouvez parcourir les cartes de manière fiable dans l'ordre souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!