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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-02 04:40:02811ブラウズ

How to Group and Sum Slices of Structs in Go?

Go での構造体のスライスのグループ化と合計

問題

プログラミングでは、多くの場合、インメモリでデータ操作タスクを実行する必要があります。コレクション。一般的な操作の 1 つは、データをカテゴリにグループ化し、各カテゴリ内の値を合計することです。この問題は、構造体のスライスを操作するときによく発生します。

課題

次の構造体のスライスを考えてみましょう:

<code class="go">type Register struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
    money int
}</code>

タスクは、要素をグループ化することです。最初の 8 つのフィールド (id フィールド) でスライスし、各グループの Money フィールドを合計します。この操作は SQL クエリに似ています。

<code class="sql">SELECT SUM(money) FROM Registers GROUP BY id1, id2, id3, id4, id5, id6, id7, id8;</code>

解決策

Go では、この問題に対処する方法がいくつかあります。 1 つのオプションは、ハッシュ テーブルを使用して、ID フィールドの一意の組み合わせごとに合計を追跡することです。

  1. キーの種類を作成します: のみを含む Key という新しい構造体を定義します。 ID フィールド。この構造体は、各グループの一意の識別子として機能します。
  2. レジスタの変換: 各要素が Key フィールドと Money フィールドを持つ構造体である新しいスライスを作成します。 Key フィールドは要素の対応するキーに設定され、money フィールドは変更されません。
  3. マップの初期化: キー値を整数の合計にマップするマップを作成します。
  4. 反復と蓄積: 変換されたスライスを反復します。各要素について、要素のキーを使用してマップから合計を取得し、要素の金額フィールドを追加して、更新された合計をマップに格納し直します。

次のコードは、このアプローチを示しています。

<code class="go">type Key struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
}

func groupAndSum(registers []*Register) map[Key]int {
    m := map[Key]int{}
    for _, r := range registers {
        key := Key{
            id1: r.id1,
            id2: r.id2,
            id3: r.id3,
            id4: r.id4,
            id5: r.id5,
            id6: r.id6,
            id7: r.id7,
            id8: r.id8,
        }
        m[key] += r.money
    }
    return m
}</code>

このソリューションは、キーに基づいて構造体をグループ化し、合計する効率的な方法を提供します。

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

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