ホームページ >バックエンド開発 >Golang >golang traverseで要素を削除する

golang traverseで要素を削除する

王林
王林オリジナル
2023-05-13 10:03:071265ブラウズ

Go 言語では、要素の走査と削除は比較的一般的な要件です。ただし、Go 言語の特殊な機能により、いくつかの詳細に注意する必要があります。この記事では、Go言語で要素を走査・削除する際の注意点と、それを正しく実装する方法を紹介します。

Go 言語のスライスとマップのデータ構造は非常に使いやすいです。スライスは自動的に展開でき、マップはキー値に基づいて対応する値にすばやくアクセスできます。これらの機能により、Go 言語は大量のデータの処理に非常に適しています。ただし、スライスとマップを走査して要素を削除する場合は、次の問題に注意する必要があります。

  1. スライスを走査して要素を削除する

スライス内の要素を削除するときは、次の点に注意する必要があります:

1) 実行します。トラバーサル中にスライスを変更しないでください

トラバーサル中にスライスを直接削除すると、インデックスが無効になり、誤って削除したり、削除し忘れたりする可能性があります。例:

func main() {
    nums := []int{1, 2, 3, 4, 5}
    for i, n := range nums {
        if n == 3 {
            nums = append(nums[:i], nums[i+1:]...)
        }
    }
    fmt.Println(nums) // 1 2 4 5
}

上記のコードが要素 3 に移動すると、要素は削除されます。ただし、要素を削除するときにスライスの長さとインデックスが変更されたため、後続の要素のインデックスが変更され、実際には 3 の最後の要素 4 だけが削除され、 3自体は削除されていません。

この状況を回避するには、別のスライスを使用して削除する要素の添字を記録し、トラバース後に削除操作を実行します。例:

func main() {
    nums := []int{1, 2, 3, 4, 5}
    delIdx := []int{}
    for i, n := range nums {
        if n == 3 {
            delIdx = append(delIdx, i)
        }
    }
    for i, idx := range delIdx {
        nums = append(nums[:idx-i], nums[idx-i+1:]...)
    }
    fmt.Println(nums) // 1 2 4 5
}

上記のコードでは、削除する要素の添え字を記録するために、空のスライスdelIdxが最初に定義されます。 nums をトラバースするときに、削除する要素が見つかった場合は、その要素の添字が delIdx に追加されます。走査が完了したら、nums を削除します。

2) 「3 ポインター」を使用して削除を実装する

スライスを走査するときに要素を削除するもう 1 つの方法は、「3 ポインター」メソッドを使用することです。つまり、ポインタ i はスライスを走査するために使用され、ポインタ j は削除される要素の数を記録し、ポインタ k は通常の要素を記録します。 。具体的な実装は次のとおりです。

func main() {
    nums := []int{1, 2, 3, 4, 5}
    j := 0
    for i := range nums {
        if nums[i] != 3 {
            nums[j] = nums[i]
            j++
        }
    }
    nums = nums[:j]
    fmt.Println(nums) // 1 2 4 5
}

上記のコードでは、まず、削除する要素の数を表すポインター j を定義します。次に、ポインタ i を使用してスライスを移動します。現在の要素を削除する必要がない場合は、それをポインタ k の位置に移動し、## に 1 を加えます。 #k、正常を示す 要素数が 1 増加します。現在の要素を削除する必要がある場合は、スキップしてください。走査が完了したら、nums[:j] を使用して余分な要素を削除します。

    マップをトラバースして要素を削除する
Go 言語マップでは、要素を削除する操作は非常に簡単です。

delete 関数を使用するだけです。例:

func main() {
    m := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4}
    for k, v := range m {
        if v == 3 {
            delete(m, k)
        }
    }
    fmt.Println(m) // map[a:1 b:2 d:4]
}

マップを移動するときに要素を削除しても、インデックス エラーは発生しません。マップには順序がないため、各要素の位置は重要ではありません。したがって、トラバーサル中に

delete 関数を直接使用してください。

マップを移動するときにマップの長さを変更できないことに注意してください。たとえば、次のコードはパニックを引き起こします:

func main() {
    m := map[string]int{"a": 1, "b": 2, "c": 3, "d": 4}
    for k := range m {
        if k == "c" {
            m["e"] = 5
        }
        fmt.Println(m[k])
    }
}

キー

c を持つ要素に移動するとき、コードは新しいキーと値のペア "e" をマップに追加します。 :5。マップの長さが変化するため、実行時パニックが発生します。

要約すると、Go 言語で要素を走査して削除するときに注意する必要がある点は次のとおりです。

1) スライスを走査して要素を削除する場合、スライスを削除しないでください。別のスライスを使用して、削除する要素の添字を記録し、トラバース後に削除操作を実行するか、「3 つのポインター」を使用して削除を実装する必要があります。

2) マップを走査して要素を削除する場合、インデックスが失敗することなく

delete 関数を直接使用できます。ただし、マップの長さはトラバース中に変更できません。

上記のスキルを習得すると、Go 言語で要素の走査と削除の操作を正しく実装できるようになります。

以上がgolang traverseで要素を削除するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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