Gelung Melalui Peta dalam Susunan Sisipan
Maps in Go tidak menjamin susunan lelaran, yang boleh mengecewakan apabila anda ingin mendapatkan semula item mengikut susunan yang dimasukkan. Walaupun sesetengah penyelesaian wujud, ia selalunya melibatkan penggunaan kepingan berasingan atau mencipta pertindihan data, yang boleh membawa kepada kerumitan dan potensi pepijat.
Penyelesaian dengan Keratan Kunci
Satu yang berdaya maju penyelesaian adalah untuk mengekalkan sekeping kunci dalam susunan sisipan. Apabila menambah pasangan baharu pada peta, semak dahulu sama ada kunci wujud dalam kepingan. Jika tidak, tambahkan kunci pada kepingan. Apabila lelaran, hanya gunakan kepingan untuk mendapatkan semula kekunci mengikut susunan dan akses nilai yang sepadan daripada peta. Pendekatan ini mempunyai overhed minimum kerana kepingan hanya menyimpan kekunci.
Contoh:
type Key int type Value int type OrderedMap struct { m map[Key]Value keys []Key } func NewOrderedMap() *OrderedMap { return &OrderedMap{m: make(map[Key]Value)} } func (om *OrderedMap) Set(k Key, v Value) { if _, ok := om.m[k]; !ok { om.keys = append(om.keys, k) } om.m[k] = v } func (om *OrderedMap) Range() { for _, k := range om.keys { fmt.Println(om.m[k]) } }
Penyelesaian dengan Senarai Terkait Pembungkus Nilai
Sebagai alternatif, anda boleh membungkus nilai dalam struktur senarai terpaut. Setiap pembalut nilai mengandungi nilai sebenar dan penunjuk ke kunci seterusnya dalam senarai. Apabila menambah pasangan baharu, tetapkan penuding seterusnya pembungkus nilai sebelumnya untuk menghala ke kunci baharu. Apabila melelaran, mulakan dari kekunci pertama dan ikuti petunjuk seterusnya untuk mendapatkan semula nilai mengikut tertib.
Contoh:
type Key int type Value int type ValueWrapper struct { v Value next *Key } type OrderedMap struct { m map[Key]ValueWrapper first, last *Key } func NewOrderedMap() *OrderedMap { return &OrderedMap{m: make(map[Key]ValueWrapper)} } func (om *OrderedMap) Set(k Key, v Value) { if _, ok := om.m[k]; !ok && om.last != nil { pw2 := om.m[*om.last] om.m[*om.last] = ValueWrapper{pw2.v, &k} } pw := ValueWrapper{v: v} om.m[k] = pw if om.first == nil { om.first = &k } om.last = &k } func (om *OrderedMap) Range() { for k := om.first; k != nil; { pw := om.m[*k] fmt.Println(pw.v) k = pw.next } }
Perbandingan
Pendekatan kepingan kunci adalah lebih mudah tetapi kurang cekap untuk penyingkiran unsur kerana ia memerlukan carian linear dalam kepingan. Pendekatan senarai terpaut pembalut nilai membolehkan penyingkiran elemen pantas, menjadikannya lebih sesuai untuk kes yang dijangkakan pemadaman kerap.
Akhirnya, pilihan terbaik bergantung pada keperluan khusus aplikasi anda.
Atas ialah kandungan terperinci Bagaimana untuk Mengekalkan Susunan Sisipan Apabila Memulas Melalui Peta Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!