ホームページ  >  記事  >  バックエンド開発  >  Go でマップとキー構造体を使用して構造体のスライスをグループ化して合計するにはどうすればよいですか?

Go でマップとキー構造体を使用して構造体のスライスをグループ化して合計するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-01 18:04:02687ブラウズ

How can I group and sum slices of structs in Go using maps and key structs?

Go で構造体のスライスをグループ化して合計する

データを分析するとき、多くの場合、類似した要素をグループ化し、集計値を計算する必要があります。各グループ。 LINQ では、これはメモリ内クエリを使用して効率的に実現できます。 Go は、マップとクロージャを使用して同様の操作を実行する多用途の方法を提供します。

各構造体に複数の一意の識別子 (id1 から id8) と整数値 (money) が含まれる Register 構造体のスライスを考えてみましょう。目標は、これらのレジスタを一意の識別子でグループ化し、各グループに対応する金額を合計することです。

手動でのグループ化と合計:

1 つのアプローチは、カスタム Equal 関数を使用して、識別子に基づいて Register 構造体を比較します。次に、スライスを反復処理して、各レジスタがハッシュ テーブルにすでに存在するかどうかを確認します。そうであれば、貨幣価値が増加します。そうでない場合は、レジスタと初期通貨値 0 を含むハッシュ テーブルに新しいエントリが追加されます。

キー構造体とマップの使用:

Go のマップは、グループ化と合計の操作をより効率的に実行する方法を提供します。一意の識別子 (id1 ~ id8) のみを含む別の Key 構造体を定義すると、それをマップの一意のキーとして使用できます。マップ内の値は、同じ識別子の組み合わせを持つレジスターの金額の合計とすることができます。

このアプローチを実装するには:

  • キー構造体とレジスター構造体を定義します:
<code class="go">type Key struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
}

type Register struct {
    key   Key
    money int
}</code>
  • キーとして Key を使用し、値として初期通貨値を使用してマップを設定します。
<code class="go">m := map[Key]int{}</code>
  • レジスターを反復処理します。それらをマップに追加するか、対応する金額を更新します:
<code class="go">for _, v := range regs {
    m[v.key] += v.money
}</code>

出力と書式設定:

結果を適切に表示するには、すべてのフィールドの先頭に id が付いているキー構造体。例:

<code class="go">fmt.Println("Nice output:")
for k, v := range m {
    fmt.Printf("%+3v: %d\n", k, v)
}</code>

結論:

主要な構造体でマップを使用することは、Go で構造体のスライスをグループ化して合計するための効率的かつ柔軟な方法です。これは、特に大規模なデータセットを扱う場合に、手動のグループ化と合計に代わるパフォーマンスの高い代替手段となります。

以上がGo でマップとキー構造体を使用して構造体のスライスをグループ化して合計するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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