Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk Mengekalkan Susunan Sisipan Apabila Memulas Melalui Peta Go?

Bagaimana untuk Mengekalkan Susunan Sisipan Apabila Memulas Melalui Peta Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-20 00:29:09848semak imbas

How to Maintain Insertion Order When Iterating Through a Go Map?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn