ホームページ > バックエンド開発 > Golang > Go スライスまたは配列内で固有の要素を見つけるにはどうすればよいですか?

Go スライスまたは配列内で固有の要素を見つけるにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-02 11:02:30
オリジナル
445 人が閲覧しました

How to Find Unique Elements in a Go Slice or Array?

Go スライスまたは配列内の固有の項目の検索

Go でデータを扱う場合、固有の要素のみを抽出する必要がある場合があります。スライスまたは配列から。 Python はこの目的のためにセットのような便利な構造を提供しますが、Go は同様の組み込み機能をネイティブに提供しません。

質問で提供されているサンプル コードを考えてみましょう。ここでの目的は、リストから一意の座標を見つけることです。重複が含まれています。このコードは、元のリスト (訪問済み) と最初は空の一意のリストの両方を反復処理し、リフレクションを使用して訪問済みの各要素と一意のすべての要素を比較することでこれを達成しようとします。

コード分析とエラー

ただし、このコードにはいくつかの問題があります。

  • 要素の比較にリフレクション (reflect.DeepEqual()) を使用するのは不要であり、追加の複雑さの層が生じます。
  • 内部ループは、要素が一意に既に存在するかどうかを考慮せずに要素を盲目的に追加するため、同じ要素が複数回追加されます。

改善された解決策

目的のロジックに従う、簡略化されたより効率的なソリューションを以下に示します。

<code class="go">visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
var unique []visit

for _, v := range visited {
    skip := false
    for _, u := range unique {
        if v == u {
            skip = true
            break
        }
    }
    if !skip {
        unique = append(unique, v)
    }
}

fmt.Println(unique)</code>
ログイン後にコピー

Map を使用した代替ソリューション

代わりに、Go のマップを活用することもできます[訪問] bool を使用してセットのような構造を作成し、次のように一意の要素を抽出します。

<code class="go">visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
unique := map[visit]bool{}

for _, v := range visited {
    unique[v] = true
}

fmt.Println(unique)</code>
ログイン後にコピー

マップ キーは一意の要素を表します。一意の訪問値のスライスを取得するには、追加の手順が必要です。

<code class="go">visited := []visit{
    visit{1, 100},
    visit{2, 2},
    visit{1, 100},
    visit{1, 1},
}
var unique []visit

m := map[visit]bool{}

for _, v := range visited {
    if !m[v] {
        m[v] = true
        unique = append(unique, v)
    }
}

fmt.Println(unique)</code>
ログイン後にコピー

これらのソリューションは、Go スライスまたは配列内の一意の要素を効果的に見つけ、問題のステートメントに準拠し、構築時に効率的な代替手段を提供します。セットの機能が不足しています。

以上がGo スライスまたは配列内で固有の要素を見つけるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート