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
Lepaskan: 2024-12-20 00:29:09
asal
846 orang telah melayarinya

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])
    }
}
Salin selepas log masuk

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
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan