ホームページ >バックエンド開発 >Golang >Go マップを特定の順序で反復するにはどうすればよいですか?

Go マップを特定の順序で反復するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-26 08:15:09712ブラウズ

How Can I Iterate Through a Go Map in a Specific Order?

Go マップの順序立てた反復: 包括的なガイド

言語の仕様により、Go マップを順番に反復するのは難しい場合があります。これは、順序の維持ではなく同時実行性を重視します。この記事では、マップを使用する利点を維持しながら、順序付けされた反復を実現するための 2 つの確実な方法について説明します。

1.キー スライスによる順序の維持

この方法では、反復の順序を確保するために別のスライスでマップ キーを追跡します。このアプローチでは、オーバーヘッドが発生しますが、シンプルさと明確な実装が実現します。

  • キー ラップ: マップに挿入されたキーごとに、キー スライスに存在するかどうかを確認します。そうでない場合は、キーをスライスに追加します。
  • スライスの使用法: 反復中に、キー スライスを使用して、マップ内の対応する値にアクセスします。
  • 同期の維持: 対応する値がスライスから削除されたときに、スライスからキーを削除します。 map.

実装例:

type Key int   // Key type
type Value int // Value type

type Map struct {
    m    map[Key]Value
    keys []Key
}

func New() *Map {
    return &Map{m: make(map[Key]Value)}
}

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])
    }
}

2. LinkedList での値のリンク

このアプローチには、実際の値と次のキーへの参照を含む構造体で値をラップすることが含まれます。これにより、要素の効率的な挿入と削除が可能になります。

  • 値ラッパー: 値と次のキーへの参照を含む値ラッパー構造体を定義します。
  • Map Insertion: 値ラッパーをキーの値として設定します。 map.
  • リンクメカニズム: 挿入順序を維持するために、新しいラッパーを前のラッパーにリンクします。
  • 反復: 最初のキーから反復を開始します。次の参照に従って、挿入順序で値にアクセスします。

例実装:

type Key int   // Key type
type Value int // Value type

type valueWrapper struct {
    value Value
    next  *Key // Next key
}

type Map struct {
    m           map[Key]valueWrapper
    first, last *Key
}

func New() *Map {
    return &Map{m: make(map[Key]valueWrapper)}
}

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.value, &k}
    }
    w := valueWrapper{value: 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.value)
        k = w.next
    }
}

ボーナス:

考慮すべき追加のヒントをいくつか示します:

  • マップの実装: マップをラップし、必要な情報を提供するカスタム タイプの作成を検討してください。順序付けされた反復のためのメソッド。
  • 最適化: オーバーヘッドを削減し、パフォーマンスを向上させるために常に最適化を検討します。

以上がGo マップを特定の順序で反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。